JavaScript undefined-safety-pattern 是否同样好

Are both javascript undefined-safety-pattern equally good?

本文关键字:是否 undefined-safety-pattern JavaScript      更新时间:2023-09-26

具有以下 2 种模式来生成具有名称undefined的可靠局部变量,该变量应包含 undefined 两种模式中的任何一种是否比另一种更安全(不易出错/易碎)?

模式1

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

模式2

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

也许我只是担心,但是 pattern1 类型似乎可以通过简单地将变量传递给函数来破坏,然后将该变量分配给局部变量 undefined .

附注:

此外,似乎较新的浏览器(即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),实际上我想知道为什么无论如何都有一个浏览器实现允许这种仅存在错误的功能(至少我看不到用例)?

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

的,这就是为什么此模式仅在IEFE中使用,其中您自己是该函数的唯一调用者:

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

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

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

因此,无论如何都使安全模式变得超级浮华

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

想知道为什么无论如何都有一个浏览器实现允许这种仅限错误的功能(至少我看不到用例)?

这只是ES 3规格中的不足。这从来都不是一个"功能",它只是被遗忘了。

这两种模式基本上会产生相同的效果,其第三方库/框架采用这种方法来最大限度地减少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);

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

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

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