this在不同情况的指向问题

------------恢复内容开始------------

全局环境:

  无论是否在严格模式下,在全局执行环境中,(任何函数体外部)this都指向全局对象。

复制代码
// 在浏览器中, window 对象同时也是全局对象:
console.log(this === window); // true

a = 37;
console.log(window.a); // 37

this.b = "MDN";
console.log(window.b)  // "MDN"
console.log(b)         // "MDN"
复制代码

 

函数(运行内)环境:

  在函数内部,this的值取决于函数被调用的方式。普通函数内部的this分两种情况,严格和非严格模式。

  •   非严格模式下,this默认指向全局对象window。

  

function f1(){
  return this;
}
//在浏览器中:
f1() === window;   //在浏览器中,全局对象是window

//在Node中:
f1() === global;
  • 在严格模式下,this将会默认为undefined
function f2(){
  "use strict"; // 这里是严格模式
  return this;
}

f2() === undefined; // true

 

作为对象的方法:

  当函数作为对象里的方法被调用时,它们的this是调用该函数的对象。

  • 函数的定义位置不影响其this指向,this指向只和调用函数的对象有关。
  • 多层嵌套的对象,内部方法的this只想被调用函数最近的对象(window也是对象,其内部对象调用方法的this指向内部对象,而非window)
var o = {
  prop: 37,
  f: function() {
    return this.prop;
  }
};

console.log(o.f()); // logs 37

  请注意,这样的行为,根本不受函数定义方式或位置的影响。在前面的例子中,我们在定义对象o的同时,将函数内联定义为成员 f 。但是,我们也可以先定义函数,然后再将其附属到o.f。这样做会导致相同的行为:

复制代码
var o = {prop: 37};

function independent() {
  return this.prop;
}

o.f = independent;

console.log(o.f()); // logs 37
复制代码

 

this出现的场景分为四类
1、有对象就指向调用对象
2、没调用对象就指向全局对象:window是js中的全局对象
3、用new构造就指向新对象
4、通过apply或者call或bind来改变this的指向

posted on   SE7EN_96  阅读(55)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示