关于功能:以下两个javascript代码有什么区别?

What are the differences between following two javascript code?

本问题已经有最佳答案,请猛点这里访问。

在一些使用立即函数的Javascript代码中,它具有参数windowdocument,如下所示:

1
2
3
(function (window, document) {
  ...
})(window, document);

但是,windowdocument是全局对象,可以直接访问如下:

1
2
3
4
5
6
(function () {
  var userAgent = window.navigator.userAgent;
  ...
  var el = document.getElementById(...)
  ...
})();

上述两个代码之间有什么区别。 哪种方式更好,为什么?


What are the differences between the above two codes. Which is better way and why?

仅在浏览器的所有实用性和用法中,没有明显的区别。

也就是说,引用局部变量而不是全局变量会带来非常轻微的性能提升。

此外,它允许通过模拟版本交换真实window的灵活性;这在测试期间以及在某些对象不可用且必须更换的某些环境中非常有用。

顺便说一句,你可以传递另一种论点,即undefined;它是这样的:

1
2
3
(function(undefined) {
    // your code
}());

您实际上并没有将任何内容传递给外部函数,这样做可以确保undefined没有被篡改;像我这样迂腐的人只会void 0为此目的:)


我能想到的两个原因:

1)局部变量是范围链中的第一个,因此它们的访问速度比全局变量快(我的意思更快,意味着更快)。

2)在函数内部,windowdocument是局部变量,因此可以最小化它们的名称:

1
2
3
4
(function (w, d) {
//var userAgent = w.navigator.userAgent;

)(window, document);


区别在于多态:在第一种情况下,您可以将任何一对对象传递给函数,该对象的行为与windowdocument对象(至少对于函数调用的方法),并且该函数也可以使用他们。

在实践中,特别是对于这两个对象,任何好处都更容易出错 - 每个人都希望windowdocument是由Javascript定义的windowdocument。但从理论上讲,这就是收益。