5 回答
TA贡献1850条经验 获得超11个赞
看了一下答案,大家的主要困惑在于第三个式子。其实很好理解,不要被第二个和第四个绕进去了。
第二个是一个赋值,赋值后的func仅仅是一个函数引用,这个引用丢失了函数原本所在的上下文信息,所以最终是在全局上下文中运行
第四个为什么不行?原因是因为赋值表达式的副作用
:赋值表达式会返回等号右边的值!因此整个赋值表达式的结果是一个函数,这个函数同样丢失了它所在的上下文。因此结果与2一样了。如果把等号换成逗号,会得到同样的结果,因为逗号表达式也有相同的副作用。
再看3,3有什么问题?没问题!因为括!号!没!有!副!作!用
!你说它会返回一个表达式,表达式就表达式,whatever,单独看第一个式子的括号前面的部分也是一个表达式,不是吗?
TA贡献1802条经验 获得超5个赞
1.第一个和第三个没有区别,运行的都是obj.inner.print(),里面的this指向obj.inner.num
2.第四个
首先你要知道一点,复制操作,会返回所赋的值
var a;
console.log(a = 5); //5
所以(obj.inner.print = obj.inner.print)的结果就是一个函数,内容是
function () {
console.log(this.num);
}
在全局下运行这个函数,里面的this指向的就是window,所以(obj.inner.print = obj.inner.print)();的结果就是
var num = 100;
function () {
console.log(this.num);
}()
// 100
添加回答
举报