在javascript中解释重新绑定全局变量到本地的模式

时间:2012-12-21 22:39:59

标签: javascript

  

可能重复:
  How does this JavaScript/JQuery Syntax work: (function( window, undefined ) { })(window)?

我在jquery source code (line 13)中看到了这种模式,他们将'window'和'undefined'重新绑定到本地人:

(function(window, undefined) {
     window.something = 42;
     var dummy = 42 === undefined;
}(window));

我认为将“窗口”重新绑定到本地是一种严格的模式(防止意外访问窗口) - 但是看看它们如何将undefined绑定到本地。为什么呢?

2 个答案:

答案 0 :(得分:2)

在JavaScript中,您可以为undefined分配值,例如:

undefined=42;

jQuery表示法确保块中的undefined确实未定义。

According to MDN

  

从JavaScript 1.8.5开始,根据ECMAScript 5规范,undefined是不可写的。

答案 1 :(得分:1)

如果有人改变undefined您的代码行为将无法预测:

 undefined = 42;

所以你通过在调用期间不传递该参数来强制函数中的undefined始终是正确的:

 function safe(undefined) {
   // undefined is really undefined here
 }

 function unsafe() {
   // undefined could be 42 here
 }

 undefined = 42;
 safe();
 unsafe();

window类似。同时传递window会给你额外的优势,你可以测试你的功能而不会真正影响真实的窗口。即你的“模拟”窗口可以有自定义setTimeout来测试函数的计时行为。

 function complex(window)
 {
    window.setTimeout(callback, 1000);
 } 

 var mockWindow = {setTimeout:...};
 complex(mockWindow);
 // here you can make sure setTimout was called and if necessary
 // call the callback.