三种状况:bash
// 状况一
(obj.foo = obj.foo)() // window
// 状况二
(false || obj.foo)() // window
// 状况三
(1, obj.foo)() // window
复制代码
分析: obj.foo就是一个值。这个值真正调用的时候,运行环境已经不是obj了,而是全局环境,因此this再也不指向obj函数
简述: JavaScript 引擎内部,obj和obj.foo储存在两个内存地址,称为地址一和地址二。obj.foo()这样调用时,是从地址一调用地址二,所以地址二的运行环境是地址一,this指向obj。可是,上面三种状况,都是直接取出地址二进行调用,这样的话,运行环境就是全局环境,所以this指向全局环境ui
例子:this
// 状况一
(obj.foo = function () {
console.log(this);
})()
// 等同于
(function () {
console.log(this);
})()
// 状况二
(false || function () {
console.log(this);
})()
// 状况三
(1, function () {
console.log(this);
})()
复制代码
除此以外:spa
var a = {
b: {
m: function () {
console.log(this.p);
},
p: "hello"
}
};
var hello = a.b.m;
hello() //undefined
复制代码
与.net
var a = {
b: {
m: function () {
console.log(this.p);
},
p: "hello"
}
}
var hello = a.b;
hello.m(); //hello
复制代码
解析: 将其赋值给hello变量,结果调用时,this指向了顶层对象。为了不这个问题,能够只将m所在的对象赋值给hello,这样调用时,this的指向就不会变code
回顾:对象
var a = {
b: {
m: ()=> {
console.log(this.p);
},
p: "hello"
}
}
var hello = a.b;
hello.m(); //undefined
复制代码
解析请看此时不能使用箭头函数blog