JavaScript undefined-safety-pattern 是否同样好
Are both javascript undefined-safety-pattern equally good?
具有以下 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
})();
那么它在结果上与第二种模式相等。但是,第一种模式通常是使用的模式,因为在任何情况下将所有代码包含在闭包中都是一个好主意(以避免将变量泄漏到全局范围内)。
- 访问布局信息是否也会导致浏览器重排
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 如何检测是否有溢出
- jQuery中是否内置了任何字符串格式化函数
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 测试索引值是否等于某个数字的倍数
- 为什么会出现错误;未捕获的类型错误:undefined不是函数;
- Fancybox是否将Click事件静音
- 主干-不管怎样,检查事件以前是否绑定过
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- 是否有一个JS/jQuery函数可以获取某个类的每个元素的ID
- IIFE是否总是返回undefined
- JavaScript undefined-safety-pattern 是否同样好
- 是否可以使用变量!= null而不是变量!== undefined &&== null
- JavaScript,一种检查嵌套对象属性是否为null/undefined的优雅方式
- JavaScript检查value是否只有undefined、null或false
- 在遍历JavaScript对象时,是否可以使用undefined作为键?
- 是否存在将undefined赋值给变量的有意义的用例?
- 检查javascript中的undefined——我是否应该使用typeof
- 我可以't检查被求值的变量是否为undefined