【问题标题】: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 应用于评估表达式 的结果。这样做的主要动机是,deletetypeof 等运算符可以应用于带括号的表达式。

      【讨论】:

      • 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
      相关资源
      最近更新 更多