MDN 中的严格模式定义如下
在正常代码中任何默默失败的分配(分配给 不可写属性,分配给仅吸气剂属性, 分配给不可扩展对象上的新属性)将抛出 严格模式
因此,在正常代码中默默失败的文档分配会在严格模式下引发异常(如预期)。
> var document = 1
// normal mode
> document
#document
// strict mode
x Uncaught TypeError: Cannot assign to read only property 'document' of object [object Object]
但是对于
window
的情况,严格模式下不会出错。它只是默默地失败了。
> var window = 1
> window
Window {external: Object, chrome: Object, document: document…}
另一种情况是
console
可以重新分配而不会出现任何错误并保留分配。
> var console = 1
> console
1
但是
localStorage
既不保留赋值也不抛出异常。
> var localStorage = 1
> localStorage
Storage {}
为什么即使在严格模式下,window 和 localStorage 也会默默地失败?还有哪些人有这样的行为?
(Chrome 48.0.2564.116)
window
和 localStorage
是 主机对象
由于宿主对象是由宿主环境定义的,因此它们经常会产生意想不到的结果。在 Internet Explorer 中尤其如此,但在现代浏览器的边缘情况下仍然如此。