3
//Global Scope
"use strict"; //1
function A() {
    "use strict"; //2
    function innerA() {
        "use strict"; //3
    }
}

我只是想知道:

use strictat//1就足够了,还是我们必须在所有地方都明确表示//2//3

4

2 回答 2

4

在严格模式下引用 MDN ,

要为整个脚本调用严格模式,请将确切的语句"use strict";(或'use strict';)放在任何其他语句之前。

连接严格和非严格脚本是有问题的。因此,建议您逐个功能启用严格模式。

所以把它放在顶部适用于整个文件。您不必在每个函数中都明确提及这一点。

注意:use strict在顶部使用有其自身的问题。在链接的 MDN 页面中阅读它们。因此,根据 MDN,推荐的方法是

您还可以采用将脚本的全部内容包装在一个函数中并让该外部函数使用严格模式的方法。这消除了连接问题,但这意味着您必须将任何全局变量显式导出到函数范围之外。


你可以测试一下,像这样

'use strict';

(function () {
    return {
        1: 1,
        1: 2
    };
})();

现在,它会抛出一个错误,

SyntaxError:在严格模式下不允许对象文字中的重复数据属性

但是,当你做这样的事情

(function () {
    return {
        1: 1,
        1: 2
    };
})();

(function () {
    'use strict';
    return {
        1: 1,
        1: 2
    };
})();

它只会在第二个函数中失败,而不是在第一个函数中。因为,只有第二个函数处于严格模式。

此外,如果您在函数中有一个函数,就像您在问题中显示的那样,

(function () {
    'use strict';
    (function () {
        return {
            1: 1,
            1: 2
        };
    })();
})();

use strict由于在封闭函数中,内部函数也将处于严格模式。因此,内部函数将引发一个SyntaxError.


但是,如果你use strict在一个块中使用{},它不会有任何效果,例如,

(function () {
    {
        'use strict';
        return {
            1: 1,
            1: 2
        };
    }
})();

或者

console.log("");

'use strict';

var a = {
    1: 1,
    1: 2
};

不会抛出任何错误。


所以,use strict应该在函数的开头,或者在文件的开头。只有这样,代码才会处于严格模式。

于 2015-05-08T07:01:17.380 回答
3

定义它就//1足够了。这直接来自JavaScript:权威指南(重点由我添加):

如果脚本具有“use strict”指令,则脚本的顶级(非函数)代码是严格代码。如果函数体在严格代码中定义或者如果它具有“使用严格”指令,则它是严格代码。

于 2015-05-08T07:03:08.427 回答