为什么window.undefined在旧浏览器中是可变的?

时间:2015-04-20 07:54:07

标签: javascript browser

编写规范以使undefined可变,因此不适合比较的团队的意图是什么?

1 个答案:

答案 0 :(得分:3)

我不知道对此有一个单一的,明确的答案,但这里有一些语言设计问题,它们提供了对机制和部分的部分解释。在这里发挥作用。

首先:nulltruefalse等可比值为reserved words。这些是JavaScript语言的基本部分 - 与iffor类似。 undefined似乎与null非常相似,所以认为它们在使用方面是相同的是相当直观的。它最终有点不同 - 在这方面更像NaN

在提出这个问题时,值得问的是,实际上有多少是可变的。实际上一切 - 如果你想覆盖任何标准的构造函数或函数,你可能会。可以设置ArrayMatheval等。

原始语言中没有机制甚至使窗口上的属性不可变。即使设计师认为阻止对undefined进行更改也是一个好主意,除了在语言中改变其语法意义之外,还有其他方法无法做到这一点。

尽管如此,核心语言规范提供了对变量变更方式和原因的更多控制。 ECMAScript 5添加了控制属性如何可变的方法,以及是否可以配置变量writable。这可以通过Object.getOwnPropertyDescriptor函数看到。我相信窗口上唯一可以被视为“核心JavaScript”的不可写值是undefinedInfinityNaN(其他值在浏览器中是不可写的,但我相信它们几乎都与浏览器本身有关,并且不是语言的基础)。规范的Section 15.1.1有详细说明;我在original spec找不到任何类似内容。

这仍然不能完全阻止你“覆盖未定义” - 如果你不在全局范围内,你可以把它当作变量。因此,只需在全局范围内执行时打印undefined -

var undefined = 5;
console.log(undefined);

但这会打印5 -

(function() {
    var undefined = 5;
    console.log(undefined);
})();

这根本不会改变值,它只是创建一个名为“undefined”的变量的新本地引用。由于该值是在顶级作用域(window)上定义的,因此该语言仅阻止在该特定对象上分配该特定属性。