为什么IIFE这个关键字指的是窗口对象..?

时间:2016-05-27 10:25:19

标签: javascript javascript-objects

当我运行以下代码时,为什么IFFE 引用窗口对象而不是 a

var a = {
 printThis : function () {
 console.log('printThis', this);
  var inner = (function () {
    console.log('inner', this);
   })();
  }
};

a.printThis();

//输出

printThis 一个对象

内部窗口对象< - 为什么......?

1 个答案:

答案 0 :(得分:8)

考虑以下示例:

var a = {};
var b = {};
a.hello = function() { console.log(this); };
b.hello = a.hello;

在大多数编程语言中,b.hello()会打印a,因为它们基于函数所在的this。该函数位于a,因此thisa。有道理,对吧?

然而,JavaScript在这方面有点不同。而不是它在哪里,它基于如何被称为b.hello()hello上调用了b,因此this设置为b。这也是有道理的,因为JavaScript并没有真正具有“where”函数的概念(不像Java中的方法,它总是与特定的类绑定),并且很难确定a是“是”的地方。

因此,foo.bar()将始终将this设置为foo,以便调用bar(除非有人使用bind或类似绑定提前this到特定值。

现在,一个IIFE被调用......没什么,真的。这不是foo.bar()情况,它只是bar(),其中bar是您的函数表达式。在没有foo的情况下,默认为window对象。

有两种简单的解决方法:

  1. 在IIFE之外创建一个包含您感兴趣的值的变量:var that = this;并在IIFE中使用that代替this,或
  2. bind this值:(function(){ CODE GOES HERE }).bind(this)();