code
<script>
var num = 100;
var obj = {
num: 200,
inner: {
num: 300,
print: function () {
console.log(this.num);
}
}
}
obj.inner.print(); //300
var func = obj.inner.print;
func(); //100
(obj.inner.print)(); //300
(obj.inner.print = obj.inner.print)(); //100
</script>
问题
- 第一个和第三个有什么区别?
- 第三个和第四个有什么区别?
看了一下答案,大家的主要困惑在于第三个式子。其实很好理解,不要被第二个和第四个绕进去了。
第二个是一个赋值,赋值后的func仅仅是一个函数引用,这个引用丢失了函数原本所在的上下文信息,所以最终是在全局上下文中运行
第四个为什么不行?原因是因为赋值表达式的
副作用
:赋值表达式会返回等号右边的值!因此整个赋值表达式的结果是一个函数,这个函数同样丢失了它所在的上下文。因此结果与2一样了。如果把等号换成逗号,会得到同样的结果,因为逗号表达式也有相同的副作用。再看3,3有什么问题?没问题!因为
括!号!没!有!副!作!用
!你说它会返回一个表达式,表达式就表达式,whatever,单独看第一个式子的括号前面的部分也是一个表达式,不是吗?