Javascript 为什么要重用“未定义的”?

Javascript 为什么要重用“未定义的”?,javascript,jquery,Javascript,Jquery,在关于如何构建jQuery1.4的文章中,他提到了一点,他在jQuery闭包中添加了一个未定义的变量,因为“我们可以重用(变量)” 未定义不是普通变量: > var undefined = 4 undefined > undefined undefined 因此,我们知道undefined不是一个变量。那么为什么要在jQuery源代码中重新定义一个未定义的 因为在某些JavaScript引擎中,可以将未定义的设置为一个值。这是为了确保undefined确实是undefine

在关于如何构建jQuery1.4的文章中,他提到了一点,他在jQuery闭包中添加了一个
未定义的
变量,因为“我们可以重用(变量)”

未定义
不是普通变量:

> var undefined = 4
  undefined
> undefined
  undefined
因此,我们知道undefined不是一个变量。那么为什么要在jQuery源代码中重新定义一个
未定义的


因为在某些JavaScript引擎中,可以将
未定义的
设置为一个值。这是为了确保
undefined
确实是
undefined

除了+火箭危险品的答案,当您的代码经常使用
undefined
时,您可以在压缩后稍微减小文件大小。这是因为局部变量
未定义
的名称可能会被压缩器损坏,而全局变量
未定义
可能不会:

foo === undefined;
//      ^----- don't touch this, put "undefined" in the compressed result

(function (undefined) {
    foo === undefined;
})();
// may however be mangled to
(function(u){foo===u})();

在旧浏览器中,可以重新定义全局
未定义的
。情况不再是这样了。@CrazyTrain这应该是答案。@CrazyTrain是对的,您可以在闭包中定义未定义的:(function(undefined){undefined=5;console.log(undefined);})我建议不要这样保护。这太愚蠢了。如果人们愚蠢到重新定义了
未定义的
,他们应该得到将会发生的一切。@user1737909:这很公平,但如果是恶意脚本呢:O@user1737909存在涉及来自多个来源的脚本的上下文(想想“杂志”广告支持的站点),因此,人们可能希望保护自己的代码不受其他人的愚蠢(或恶意)的影响。没关系。如果有人重新定义了原型怎么办?你也会以同样的方式被注定,你无法抵御一切。仅针对未定义的错误进行保护最多只能让您感觉更安全。@user1737909虽然我同意,但我不认为您可以构建javascript库,并且不添加一些故障保护程序来防止不必要的错误,不管它们多么愚蠢。@user1737909:
void 0
不能从6个字符减少
undefined
可以减少为1。你是在说gzip压缩还是缩小?@josh3736那么我希望缩小器不要碰到undefined
,因为它应该知道它在技术上是一个保留字。在这种情况下,
void 0
较短。gzip压缩它可能会产生您所说的效果。我不知道
未定义
作为参数是否比
无效0
更快。也许没关系<代码>(函数(u){}()
是一个单字符串
未定义的
,我想知道的是JIT是否能够静态优化它(可能)@josh3736您可以随意调用它(或不调用它),但它是一个“保留字”,因为它是语言的一个特性,不应该修改。“迷你们通常不会触及全局变量”,我希望你的意思是它们不会。如果缩小器缩小全局变量,则不应使用它。是的,从ES5开始,全局
未定义
模式有一些特殊之处,而不是严格模式…它是不可写入的: