"use strict" 严格模式继承 / 作用域

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

我想知道:

//1处执行use strict是否就足够了,还是需要在所有地方都显式指定,如//2//3


但是一个就足够了 ;) - Miroshko
2个回答

4

引用MDN关于严格模式的内容,

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

连接严格和非严格脚本存在问题。因此,建议您逐个函数启用严格模式。

因此,将其放在顶部适用于整个文件。您不必在每个函数中明确提及它。

注意:在顶部使用use strict也有其自身的问题。请在链接的MDN页面中阅读有关它们的信息。因此,根据MDN的建议,

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


您可以这样测试。
'use strict';

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

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

语法错误:严格模式下不允许对象文字中的重复数据属性

但是,当你像这样做时
(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。只有这样,代码才会进入严格模式。

3

仅在//1定义它就足够了。这是直接从《JavaScript权威指南》摘录的(我加了强调):

如果脚本有"use strict"指令,则脚本的顶层(非函数)代码是严格模式代码。如果函数体在严格模式代码中定义或具有"use strict"指令,则函数体是严格模式代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接