指定未定义的Javascript模块模式

时间:2013-12-19 10:39:36

标签: javascript design-patterns module undefined

我相信jQuery在模块模式中使用undefined以避免将其重新定义为意外值。我想过这样做,但每当我比较undefined时,我倾向于(总是?)使用

typeof foo === 'undefined'

这样做有什么意义:

(function (win, doc, RG, undefined)
{
  // App goes here

})(window, document, typeof RGraph === 'object' ? RGraph : {});

2 个答案:

答案 0 :(得分:1)

  

每当我比较未定义时,我倾向于(总是?)使用typeof foo === 'undefined'

如果您在模块中不使用undefined,那么将其声明为参数以确保其值是没有意义的。

但是,在“总是”之后会出现一个问号,并且您很难知道将来还有谁可能会使用您的代码,所以它仍然可能是明智的。

答案 1 :(得分:0)

有三种方法可以测试值是否为undefined

方法1:使用typeof

if (typeof value === "undefined") {
    // do something
}

方法2:将其与变量undefined

进行比较
if (value === undefined) {
    // do something
}

方法3:将其与void 0

进行比较
if (value === void 0) {
    // do something
}

问:你应该使用哪一个?

答:需要考虑很多因素:

  1. 就可理解性而言typeofundefined是最好的。
  2. 就最小字符而言,undefined在缩小时最佳。
  3. 在表现方面(http://jsperf.com/type-of-undefined-vs-undefined):
    1. undefinedvoid在大多数浏览器(尤其是Firefox和Chrome)中都处于同等水平。
    2. 在Chrome中typeof比其他两个慢,但在Firefox中它是最快的。
  4. 使用typeof是测试变量是否存在的唯一方法。
  5. 基于这些因素,我会说undefined(方法2)是最好的方法。始终存在undefined被覆盖的问题。但是,如果您正在使用模块模式(您应该在浏览器中执行此操作),那么您可以免费获得undefined

    (function ($, undefined) {
        // you can use `undefined` safely here
    }(jQuery));
    

    因此,如果您正在使用模块模式,那么我建议您使用第二种方法。它易读,易懂,简洁。唯一的缺点是您将无法测试变量是否存在。但是,您可以随时回到typeof