fer*_*cs2 9 javascript jslint use-strict
我在JavaScript中定义了以下函数:
function _snr(id) {
"use strict";
this.e = "something";
}
Run Code Online (Sandbox Code Playgroud)
我通过JSLint运行我的代码,它建议我在函数中添加"use strict".
当我e现在做抛出和未定义的错误.从一些初步调查来看,似乎已经不再定义了this过去引用的内容_snr.
我读过"严格使用",并发现它用于防止不安全的做法.有人可以解释一下这是不安全的吗?什么是"use strict"实际上在做什么以及如何修复我的代码?
Rob*_*obG 10
如果在未设置函数的情况下调用函数this,则在非严格模式下this将其设置为引用全局(浏览器中的窗口)对象.在严格模式下,它仍然是未定义的.
如果您的函数被调用,_snr(...)则它this未被设置,因此在非严格模式下this将设置为全局对象,因此this.e = ...引用(或由于赋值而创建)全局e属性.
但是,在严格模式下this将是未定义的,并且尝试访问undefined属性会引发错误.
它在ECMA-262§10.4.3输入功能代码中进行了解释.
如果您希望以与严格和非严格模式一致的方式从函数内部访问全局对象,则可以使用以下内容:
var _snr = (function(global) {
return function (id) {
global.e = "something";
};
}(this));
Run Code Online (Sandbox Code Playgroud)
在非严格模式下,您可以执行以下操作:
function _snr(id) {
var global = (function(){return this;}());
global.e = "something";
}
Run Code Online (Sandbox Code Playgroud)
因此,global在函数内引用全局对象,您不必担心函数的调用方式.但第二个例子不能在严格模式下工作.
我读过"严格使用",并发现它用于防止不安全的做法.有人可以解释一下这是不安全的吗?
在这种特殊情况下绝对没有任何意义.
但是,在更一般的情况下,能够在停止直接访问全局对象的上下文中执行代码被认为是一个好主意.上面的第二个例子展示了如何在非严格的代码中完成(即如何从函数上下文中直接访问全局对象).
什么是"使用严格"实际上在做什么
this如果调用将其设置为undefined或,则停止设置为全局对象null.见上文的结果.
以及如何修复我的代码?
往上看.
哦,最后,在ECMA-262附件C ECMAScript的严格模式中有一个关于严格模式的信息摘要.