【问题标题】:What are the differences between following two javascript code? [duplicate]以下两个javascript代码有什么区别? [复制]
【发布时间】:2013-08-29 15:42:57
【问题描述】:

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

(function (window, document) {
  ...
})(window, document);

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

(function () {
  var userAgent = window.navigator.userAgent;
  ...
  var el = document.getElementById(...)
  ...
})();

以上两个代码有什么区别。哪种方法更好,为什么?

【问题讨论】:

  • 这样做允许您在该范围内修改windowdocument 的实际值;例如Node 的情况有所不同。

标签: javascript function


【解决方案1】:

我能想到的两个原因:

1) 局部变量是作用域链中的第一个变量,因此它们的访问速度比全局变量快(我的意思是更快)

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

(function (w, d) {
//var userAgent = w.navigator.userAgent;

)(window, document);

【讨论】:

    【解决方案2】:

    以上两个代码有什么区别。哪种方法更好,为什么?

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

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

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

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

    (function(undefined) {
        // your code
    }());
    

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

    【讨论】:

      【解决方案3】:

      不同之处在于多态性:在第一种情况下,您可以向函数传递任何行为为 windowdocument 对象的对象(至少对于您的函数调用的方法),并且该函数将也和他们一起工作。

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

      【讨论】:

      • “它更容易出错” 我不明白为什么会这样。这对我来说似乎更健壮:如果您在没有window 的环境中运行脚本,您可以通过仅修改一行来将其换掉。 Duck 类型是动态类型语言的一个特性,而不是一个弱点。
      • 假设人们期望 windowdocument那些 windowdocument 我们都知道,拥有一个相对较大的函数并重新定义这些变量会导致通过快速修补功能等来解决错误。它们不是常数,但人们希望它们表现得像那样。我会用不同的名字称呼他们——这就是我的意思。
      猜你喜欢
      • 1970-01-01
      • 2017-10-17
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 2018-01-14
      相关资源
      最近更新 更多