使用以下两种模式生成一个名为undefined
且应该包含undefined
的可靠局部变量,这两种模式中的任何一种都比另一种模式更安全(更不容易出错/易碎)吗? / p>
pattern1
function(arg1,arg2,....,undefined)
{
}
PATTERN2
function(arg1,arg2,....)
{
var undefined;
}
也许我只是担心,但是只需将一个变量传递给函数然后分配给局部变量undefined
,pattern1类型就可以破解了。
此外,似乎较新的浏览器(即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的功能(至少我看不到用例)?
答案 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
})();
然后它与第二种模式的结果相同。但是,第一个模式通常是使用的模式,因为在任何情况下将所有代码封闭在闭包中都是一个好主意(避免将变量泄漏到全局范围内)。