3

可能重复:
此 JavaScript/JQuery 语法如何工作:(function(window, undefined) {})(window)?

我在jquery 源代码(第 13 行)中看到了这种模式,他们将“窗口”和“未定义”重新绑定到本地:

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

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

4

2 回答 2

2

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

undefined=42;

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

根据 MDN

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

于 2012-12-21T22:51:16.957 回答
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给你额外的adantage,你可以测试你的功能而不会实际影响真实的窗口。即您的“模拟”窗口可以自定义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.
于 2012-12-21T22:53:01.230 回答