对象的立即调用函数表达式中的步骤是什么?

时间:2018-04-22 16:50:32

标签: javascript this

我正在努力了解发生的事情"引擎盖下#34;。其他问题没有解释我感兴趣的机制。请参阅下面的代码。

我正在寻找这样的步骤:

  1. (p.foo = o.foo)(); expresion
  2. o.foo的值是否保留在某处并且与p obj无关?
  3. o.foo的执行价值是多少?
  4. p.foo获取o.foo上的值?
  5. 这是对的吗?如果是,那么在步骤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”
    
    
    

2 个答案:

答案 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。