这两个javascript undefined-safety-pattern都同样好吗?

时间:2014-11-26 10:49:11

标签: javascript

使用以下两种模式生成一个名为undefined且应该包含undefined的可靠局部变量,这两种模式中的任何一种都比另一种模式更安全(更不容易出错/易碎)吗? / p>

pattern1

 function(arg1,arg2,....,undefined)
 { 

 }

PATTERN2

 function(arg1,arg2,....)
 { 
    var undefined;
 }

也许我只是担心,但是只需将一个变量传递给函数然后分配给局部变量undefined,pattern1类型就可以破解了。

PS:

此外,似乎较新的浏览器(即FF 33 / Chromium 37)不再允许这个陷阱

window.undefined = "omg";
"omg" == undefined; //true
确实他们产生了这个

window.undefined = "omg";
console.log(window.undefined); // logs undefined and NOT "omg" in FF33/Chromium 37

因此无论如何都要使安全模式更加丰富。 对我来说,似乎很可能,window.undefined可能永远不会被重置(只读和undefined),实际上我想知道为什么有一个浏览器实现允许这个仅仅是一个bug的功能(至少我看不到用例)?

3 个答案:

答案 0 :(得分:1)

  

也许我只是担心,但是只需将变量传递给函数,pattern1类型就可以破解了

是的,这就是为什么这种模式只用于你自己是该功能的唯一调用者的IEFE中的原因:

(function(arg1, arg2, …, undefined) { 
    // …
}(val1, val2, …));
  

此外,似乎较新的浏览器不再允许这个陷阱

是的,所有实现ECMAScript 5的引擎都不允许这样做 - 全局undefined变量是不可写的,正如您所描述的那样。

  

因此无论如何都要使安全模式更加充实

事实上,使用它感觉很像货物编程。无论如何,今天每个人都期待ES5。

  

我想知道为什么有一个浏览器实现允许这个仅仅是一个bug的功能(至少我看不到用例)?

这只是缺乏ES 3规范。这从来就不是一个特色",它只是被遗忘了。

答案 1 :(得分:0)

这两种模式基本上都会产生相同的效果,它的第三方库/框架采用这种方法来最小化undefined的意外重新定义。
undefined是全局对象的属性,即它是全局范围内的变量。 undefined的初始值是未定义的原始值。

在ECMAScript 5 /现代浏览器之前,任何人都可以将此变量配置/重写为任何值。这给第三方库/框架带来了问题

 undefined = 5;//now undefined is of type number    
 //code inside library
 (function (arg1){
   if(somevar === undefined){//unintentionally it will compare somevar to 5

   }
 })(arg1);

因此,为了尽量减少全球变量的影响,他们采用了以下方法

(function (arg1, undefined){//since only one param is passed the second param undefined would indeed will be of type undefined
    if(somevar === undefined){//it will compare somevar to undefined 
    }
 })(arg1);

答案 2 :(得分:0)

您提供的第一个模式不完整。正确使用是在创建内联闭包时,以便通过不将最后一个参数的任何值传递给闭包函数来确保undefined的正确值。

(function (undefined) {
    // ... your safe code here
})();

然后它与第二种模式的结果相同。但是,第一个模式通常是使用的模式,因为在任何情况下将所有代码封闭在闭包中都是一个好主意(避免将变量泄漏到全局范围内)。