我经常看到这种模式,我遇到了这行代码
https://github.com/addyosmani/timing.js/blob/master/timing.js#L122
(function(window) {
...
})(this); // <-- this
我一直认为这是多余的。是什么需要通过&#34;这个&#34;到IIFE?
答案 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))