9

我在我的 JavaScript 中定义了以下函数:

function _snr(id) {
    "use strict";
    this.e = "something";
}

我通过 JSLint 运行我的代码,它建议我在函数中添加“use strict”。

当我e现在抛出和未定义的错误时。从一些初步调查来看,似乎不再定义thiswhich used to refer 。_snr

我读过“使用严格”,发现它是用来防止不安全的做法。有人能解释一下这有什么不安全的吗?“使用严格”实际上在做什么以及如何修复我的代码?

4

1 回答 1

11

如果一个函数在没有设置它的情况下被调用this,在非严格模式下,this它将被设置为引用全局(浏览器中的窗口)对象。在严格模式下,它将保持未定义。

如果你的函数被调用,_snr(...)那么它this没有被设置,所以在非严格模式下this将被设置为全局对象,因此this.e = ...引用(或由于分配而创建)一个全局e属性。

但是,在严格模式下this将是未定义的,并且尝试访问未定义的属性会引发错误。

ECMA-262 §10.4.3 Entering Function Code 对此进行了解释。

编辑

如果您希望以与严格模式和非严格模式一致的方式从函数内部访问全局对象,您可以使用类似:

var _snr = (function(global) {
    return function (id) {
        global.e = "something";
    };
}(this));

在非严格模式下,您可以执行以下操作:

function _snr(id) {
    var global = (function(){return this;}());
    global.e = "something";
}

这样global在函数内引用全局对象,您不必担心函数是如何被调用的。但是第二个示例在严格模式下不起作用。

其他答案:

我读过“使用严格”,发现它是用来防止不安全的做法。有人能解释一下这有什么不安全的吗?

在这种特殊情况下绝对没有。

但是,在更一般的情况下,能够在阻止它直接访问全局对象的上下文中执行代码被认为是一个好主意。上面的第二个例子展示了如何在非严格代码中完成(即如何从函数上下文中直接访问全局对象)。

“使用严格”实际上在做什么

如果调用将其设置为or ,它将停止this设置为全局对象。看上面的结果。undefinednull

以及如何修复我的代码?

往上看。

哦,最后,ECMA-262 Annex C The Strict Mode of ECMAScript中有一个关于严格模式的信息性总结。

于 2012-11-07T06:23:59.447 回答