"使用严格"继承/范围

时间:2015-05-08 06:55:26

标签: javascript use-strict

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

我只是想知道:

  

use strict上的//1是否足够,或者我们必须明确//2//3等所有地方。

2 个答案:

答案 0 :(得分:4)

strict mode

上引用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应位于函数的开头或文件的开头。只有这样代码才会处于严格模式。

答案 1 :(得分:3)

//1定义它就足够了。这直接来自 JavaScript:The Definitive Guide (我强调了这一点):

  

如果脚本具有" use strict"脚本的顶级(非功能)代码是严格的代码。指示。函数体是严格的代码,如果它是在严格的代码中定义的,或者如果它具有" use strict"指令。