我正在努力了解发生的事情"引擎盖下#34;。其他问题没有解释我感兴趣的机制。请参阅下面的代码。
我正在寻找这样的步骤:
(p.foo = o.foo)();
expresion o.foo
的值是否保留在某处并且与p obj无关? o.foo
的执行价值是多少? p.foo
获取o.foo
上的值?这是对的吗?如果是,那么在步骤2中需要更多关于如何,在哪里以及为什么......
的信息
function foo() {
console.log( this.a );
}
var a = 2;
var o = { a: 3, foo: foo };
var p = { a: 4 };
o.foo(); // 3
(p.foo = o.foo)(); // we get 2 and not 4”

答案 0 :(得分:0)
这里没有什么特别的事情发生。
这一行
(p.foo = o.foo)();
相当于在全局范围内执行以下函数(这指的是窗口),其中a的值为2,将被打印。
function foo() {
console.log( this.a );
}
以下赋值返回函数定义
p.foo = o.foo
它没有在p或o对象上执行foo。它只是在p对象上添加属性foo并为其赋值。
因此,您最终在全局范围内执行代码
(function () {
console.log( this.a );
})()
答案 1 :(得分:0)
p.foo = o.foo
是一个表达式。所有表达式都解析为一个值。在这种情况下,它是函数foo()
。
所以基本上,当你调用这段代码时,你不仅为<{1}}分配一个新值(因为它恰好表达式包含赋值运算符p.foo
) - 由于评估表达式,您还返回全局函数=
。
然后,您可以在foo
上下文中内联调用该函数,其中window
等于2。