Javascript 为什么window.undefined在旧浏览器中是可变的?
编写规范的团队的意图是什么,使Javascript 为什么window.undefined在旧浏览器中是可变的?,javascript,browser,Javascript,Browser,编写规范的团队的意图是什么,使未定义的可变,因此不利于比较?我不知道关于这一点的唯一、明确的答案,但下面是一些语言设计关注点,它们提供了部分机制和考虑因素的解释 首先也是最重要的一点:类似于null、true和false的可比较值是可用的。这些是JavaScript语言的基本部分——与if和for的级别类似undefined看起来非常像null,因此从使用角度来看,它们应该是相同的,这是相当直观的。它最终有点不同——在这方面更像是NaN 当问这个问题时,值得一问的是,事实上,多少是可变的。几乎所
未定义的可变,因此不利于比较?我不知道关于这一点的唯一、明确的答案,但下面是一些语言设计关注点,它们提供了部分机制和考虑因素的解释
首先也是最重要的一点:类似于null
、true
和false
的可比较值是可用的。这些是JavaScript语言的基本部分——与if
和for
的级别类似undefined
看起来非常像null
,因此从使用角度来看,它们应该是相同的,这是相当直观的。它最终有点不同——在这方面更像是NaN
当问这个问题时,值得一问的是,事实上,多少是可变的。几乎所有的东西——如果你想覆盖任何标准的构造函数或函数,你可能可以<代码>数组
,数学
,求值
等都可以设置
在原始语言中甚至没有使窗口上的属性不可变的机制。即使设计师认为防止对未定义的进行更改是一个好主意,但到目前为止,除了更改其在语言中的语法含义外,还没有其他方法可以这样做
然而,如今,核心语言规范提供了更多关于如何以及为什么可以更改变量的控制。ECMAScript 5以控制属性如何可变的方式添加,并且可以配置变量是否可写。这可以通过函数看到。我相信窗口上唯一可以被视为“核心JavaScript”的不可写值是未定义的
、无限
和NaN
(其他值在浏览器中是不可写的,但我相信它们几乎都与浏览器本身有关,并且不是语言的基础)。本规范的第1部分对此进行了详细说明;我在公园里找不到类似的东西
这仍然不能阻止您完全“覆盖未定义的”-如果您不在全局范围内,可以将其视为变量。因此,当在全局范围内执行时,这将只打印未定义的
var undefined = 5;
console.log(undefined);
但这将打印5-
(function() {
var undefined = 5;
console.log(undefined);
})();
这根本不会改变值,它只是创建了一个新的局部引用,指向一个名为“undefined”的变量。由于该值是在顶级作用域(窗口
)上定义的,因此该语言仅阻止分配给该特定对象上的特定属性。自动分配给刚声明的变量或没有实际参数的形式参数的原语值。更多信息请访问。。为什么现在重要?有时候事情的发生只是因为它们发生了。JavaScript最初根本没有未定义的。它有一个undefined
类型,但没有窗口。undefined
属性。后来,浏览器添加了undefined
属性,但很可能没有人认真考虑过它。@MichaelGeary只是好奇而已。所以你是说没有人期望人们改变窗口。未定义的?我个人认为这还是比较好的。如果有人想破坏JS,他们会的。还有一百万件我们不能防范的事情,为什么这件事会受到媒体的关注?@AlexanderSuraphel-@Bubbles的回答对此有着深刻的见解,特别是关键的一点:“在原始语言中,甚至没有机制使窗口上的属性不可变。”这并不是说有人认为使用窗口是一个好主意。未定义的是可变的,只是当时没有一种方便的方法来使用其他方法。请特别注意,window.undefined
不是核心JavaScript语言的一部分,只是浏览器供应商在浏览器端添加的东西(与JavaScript语言本身相反)。