什么是需要通过"这"作为全球的参数 - IIFE?

时间:2016-08-06 16:46:12

标签: javascript this

我经常看到这种模式,我遇到了这行代码

https://github.com/addyosmani/timing.js/blob/master/timing.js#L122

(function(window) {
 ...
})(this); // <-- this

我一直认为这是多余的。是什么需要通过&#34;这个&#34;到IIFE?

6 个答案:

答案 0 :(得分:2)

通过传入此内容,您明确强制参数window在范围内进行了本地化。

从技术上讲,您不需要这样做,但通过这样做,您无需访问全局变量,在本例中为窗口。这是一个很好的做法,因为,该函数不依赖于名为window的全局对象,甚至根本不是窗口对象。这是一个外部案例,是的,可能取决于你正在建设什么。如果你正在构建一个供其他人使用的框架,并且可能与其他框架一起使用,那么所有人都可以访问的全局对象可能会发生什么,所以最好是安全而不是抱歉。

答案 1 :(得分:0)

有几个原因,包括但不限于:

  • 更适合缩小(function(a){...})(window)
  • 局部变量在解决时似乎更快(可忽略不计)
  • 与其中window不存在的nodejs互操作,但global
  • 重新定义window全局变量问题(如@ 4castle所述)

答案 2 :(得分:0)

在链接代码中,IIFE是strict mode函数 - 并且它的调用发生在严格代码之外 - 因此this使得名为window的参数始终引用全局对象,而不管环境如何(节点。 js使用global代替window)。

某些较旧的浏览器允许shadow全局属性window,因此访问window可能会导致意外。

答案 3 :(得分:0)

每个函数都有自己的this上下文。它不会自动从父级继承this,除非您专门将其作为参数传递或使用Function.prototype.bind()(请在此处阅读https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)。

对于这个例子,似乎它并不重要,因为window是全局的,但实际上强制IIFE不应该使用全局变量是有用的,你也可以传递不同的上下文,假设是你正在编写单元测试,并且想要模拟window,所以你会传递一个代表window的虚假对象。

尽管如此,您的示例也可以在Node.js中使用,因为没有window全局对象,但this将评估为根对象

答案 4 :(得分:0)

通过传递this,您可以控制对象及其代码可以访问的属性。 默认情况下,this将映射到window对象,以便您可以访问其属性。但您也可以从具有类似属性的其他函数上下文中调用此代码,代码仍然可以工作,从而为您提供更大的灵活性。

答案 5 :(得分:0)

考虑全球和范围

我的观点

    this 之间,
  • window浏览器的全局对象为<script></script>
  • f{b{}}表示不同的范围,this将扮演其角色
  • 传递窗口对象是隔离污染
  • 将此作为窗口传递给其他人(人和代码)而不是直接传递window

(function(window){}(window))