Javascript 自调用函数中的不可变未定义

Javascript 自调用函数中的不可变未定义,javascript,performance,security,ecmascript-5,Javascript,Performance,Security,Ecmascript 5,ECMAScript 5问世已经有一段时间了,它已经出现在大多数现代浏览器(IE9、CH 19+、FF 4+)中,“不可变的未定义”也随之出现。尽管我一直看到“undefined”这样被传递: (function ( ..., undefined ) { })(...); 据我所知,他并不真的喜欢它: Expected an identifier and instead saw 'undefined' (a reserved word). 即使它没有被传递(函数调用中没有参数),并且它实际

ECMAScript 5问世已经有一段时间了,它已经出现在大多数现代浏览器(IE9、CH 19+、FF 4+)中,“不可变的未定义”也随之出现。尽管我一直看到“undefined”这样被传递:

(function ( ..., undefined ) {

})(...);
据我所知,他并不真的喜欢它:

Expected an identifier and instead saw 'undefined' (a reserved word).
即使它没有被传递(函数调用中没有参数),并且它实际上是一个标识符。我理解他的工具,我们应该遵循到死亡,另一方面,似乎并不关心它

这仍然被认为是当今的最佳实践吗?它如何影响代码性能/安全性?考虑到浏览器支持>=IE9

这仍然被认为是当今的最佳实践吗?它如何影响代码性能/安全性?考虑到浏览器支持>=IE9

很像,是全局对象的不可写属性,而不是类似于文本的属性,因此可以将其用作参数名而不会引发错误。让我们考虑一下这样的函数

function example(Infinity) {
    return Infinity;
}
示例
中,
无限
不再是不可写属性,而是像函数的任何其他参数一样,如果未传递任何内容或以其他方式获取参数值,则初始化为
未定义
。这意味着在这个函数中,你不能仅仅假设
无穷大
意味着无穷大,因为它并不意味着无穷大,但你可以假设它意味着
未定义

让我们回到
未定义的问题。它将被初始化为
undefined
,因此其含义将保持不变,但是,它现在已经失去了在函数中的不变性,因此任何将值分配给
undefined
的打字错误都会将此错误结转。此外,如果将参数传递给函数,则该值将与起始值不同

因此,总而言之,它确实对安全性有影响,因为像这样的
未定义的
不再是“安全的”,因为它已经失去了不可变的状态,并且可以更改



值得注意的是,
undefined
实际上并不是一个函数。如果您需要一个
undefined
以实现兼容性,而不是将其作为参数名添加,我建议使用一个简单的
var undefined
位于函数顶部,它是不可变的。

如果您想遵守,可以使用另一个非保留字的变量,而不是
未定义的
。以下各项符合:

但是,您需要记住使用新定义的变量(在本例中是
undef
,而不是
undefined
)。上面的严格模式是为了符合jsLint而添加的这主要是为了让您确定正在测试的未定义变量实际上是未定义的。

请注意,如果您在网站提供的文本区域中运行此示例,则可能需要定义
窗口
文档
。在此之前,我收到了两个错误

var window = window; //global window object
var document = document; //global window object
然而,我认为:

(function (..., undefined) {
    'use strict';

}(...));
非常好,更重要的是,强烈推荐


在某些情况下,保留字可以从其正常状态更改。例如将
undefined
设置为
true
。保罗·爱尔兰(Paul Irish)在他的视频中简要地讨论了这一点:

@bfavaretto no,它在大多数现代浏览器中都是不可变的
undefined=1;未定义;//未定义
在Firefox中,
(函数(未定义){'use strict';警报(未定义);})(1)警报
1
。似乎严格模式不允许函数参数独占
未定义的
。上面添加的
严格模式
是为了符合jsLint。你上面的例子完全符合预期。然而,既然你是在匿名自动执行函数中编程和包装代码的人,为什么你会故意这么做呢?啊哈,我正要澄清我的问题。我不明白你建议使用严格模式是以验证为导向的;现在我明白了。我知道这可能有点不清楚。我将补充一点澄清。
(function (..., undefined) {
    'use strict';

}(...));