【问题标题】:why 'this' point to 'window' obj when using assignment operator in iife?为什么在 iife 中使用赋值运算符时“this”指向“window”obj?
【发布时间】:2018-01-15 10:55:37
【问题描述】:

我想知道为什么这个例子会返回'global'而不是'obj2'? '(obj2.say = obj1.say)()' 和 '(obj2.say)()' 有什么不同? 代码如下:

var text = 'global';
var obj1 = { text: 'obj1', say: function () {console.log(this.text)}};
var obj2 = { text: 'obj2'};
(obj2.say = obj1.say)();

【问题讨论】:

  • 这里没有 IIFE。
  • @FelixKling - 不是传统意义上的,但(obj2.say = obj1.say) 是一个计算结果为函数的表达式,并且该函数立即被调用......(但是,是的,你是对的。)
  • 我希望它返回 obj1。有趣
  • 是的,@nnnnnn 是对的......

标签: javascript iife


【解决方案1】:

(obj2.say)() 只会从obj2 调用say 函数。

(obj2.say = obj1.say)() 会将obj1.say 分配给obj2.say 然后调用它。

我不确定this.text - 我希望有人能提供帮助 - 即使我很想知道这一点。

【讨论】:

    【解决方案2】:

    因为 (obj2.say = obj1.say) 的值是一个普通的 Function 对象,而 obj2.say() 是一个与 obj2 的方法调用。

    【讨论】:

      【解决方案3】:

      赋值的结果是赋值的值。示例:

      var foo, bar;
      foo = (bar = 42);
      console.log(foo); // 42
      

      因此,当您执行(obj2.say = obj1.say) 时,分组运算符返回的赋值结果是obj1.say 中的函数对象。

      整个表达式要等价于

      var result = obj2.say = obj1.say;
      result();
      

      当一个函数被“正常”调用时(func()),this refers to the global object or is undefined in strict mode。


      (obj2.say)() 其实很特别。单独的分组运算符不会解析(内部)对值的引用。 IE。 obj2.say 的结果在内部是一个参考,描述了obj2 上的成员访问say。分组运算符(...) 原样返回该引用,而不是将其解析为实际的函数对象。这就是this 将正确指向obj2 的原因。省略分组运算符具有相同的效果。

      这其实是called out in the spec:

      此算法不会将GetValue 应用于评估表达式 的结果。这样做的主要动机是,delete 和 typeof 等运算符可以应用于带括号的表达式。

      【讨论】:

      • result = obj2.say = obj1.say 是我在自己的(现在被丢弃的)答案中努力给出的解释。干得好。
      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 2020-04-01
      • 2011-03-15
      • 1970-01-01
      • 2019-12-04
      • 2016-07-25
      • 1970-01-01
      • 2015-12-25
      相关资源
      最近更新 更多