http://jsbin.com/ifabem/2/edit
"use strict";
window.x = "Hello World";
alert(x); // this does't throw an exception in strict mode
为什么不在最后一个语句中直接访问x违反严格模式并抛出异常?
是否违规只是在全局对象中写入一个新值,但是允许读取甚至修改现有对象?
答案 0 :(得分:2)
规范中没有出现“获取对全局对象的访问权”这一短语,因此没有明确的定义;但仔细阅读规范的附录C(严格模式影响的非规范性列表),我认为可以用这种方式描述的唯一限制是:
分配给未声明的标识符或以其他方式无法解析的引用不会在全局对象中创建属性。在严格模式代码中进行简单赋值时,其 LeftHandSide 不得求值为不可解析的引用。如果是,则抛出 ReferenceError 异常(8.7.2)。
因此,您不允许将属性添加到全局对象而不使用var
或window.
或诸如此类的东西,但没有什么可以阻止您从获取全局对象的属性 - 甚至设置现有属性的值。
(顺便说一句,§8.7.2的相关位在上下文中并不是非常有意义,但为了完整起见,就是这样:
3。如果IsUnresolvableReference( V ),则为 一个。如果IsStrictReference( V )为真,则为 一世。抛出 ReferenceError 异常。
湾调用全局对象的[[Put]]内部方法,通过
属性名称的GetReferencedName( V ),值的 W ,
投掷标志 false 。
)
答案 1 :(得分:1)
我认为'获取对全局对象的访问权限'意味着从非全局对象/范围中获取对它的访问权限。所以这会抛出一个引用错误:
function foo(){
"use strict";
bar = '3';
}
foo(); //=> ReferenceError: bar is not defined
换句话说,我会说'严格模式'强制在自己的范围内分配变量。这就是为什么window.x完全可能的原因。
另一方面,一个可以从函数中<{1}}寻址:
window
因此,实质上,function foo(){
"use strict";
window.bar = '3';
}
foo(); //=> no error
alert(bar); //=> 3
可以防止在没有关键字use strict
或的情况下声明变量,而无需在非全局范围内引用自己的命名空间。
答案 2 :(得分:0)
未声明的全局变量(在函数中没有var实例化的变量)是一个实例,
另一个方法是调用和应用方法不再将基元转换为全局对象 - 其中字符串变为String,并且null或未定义的传递窗口为as '这个'值。