繁体   English   中英

函数如何继承严格模式(“use strict”;)?

[英]How is strict mode ("use strict";) inherited by functions?

这是我的代码,似乎表明答案是肯定的 - http://jsfiddle.net/4nKqu/

var Foo = function() {
    'use strict'
    return {
        foo: function() {
            a = 10
            alert('a = ' + a)
        }
    }
}()

try {
    Foo.foo()
} catch (e) {
    alert(e)
}

您能否引用标准中的声明,阐明'use strict'会自动应用于我们应用了'use strict'函数中定义的所有闭包和函数?

规范的相关部分:

http://www.ecma-international.org/ecma-262/5.1/#sec-10.1.1

其中说:

 Code is interpreted as strict mode code in the following situations:
  • 如果全局代码以包含使用严格指令(见 14.1)的指令序言开头,则它是严格的全局代码。

  • 如果 Eval 代码以包含使用严格指令的指令序言开头,或者如果对 eval 的调用是对包含在严格模式代码中的 eval 函数的直接调用(参见 15.1.2.1.1),则它是严格的 eval 代码。

  • 作为 FunctionDeclaration、FunctionExpression 或访问器 PropertyAssignment 的一部分的函数代码是严格函数代码,如果其 FunctionDeclaration、FunctionExpression 或 PropertyAssignment 包含在严格模式代码中,或者如果函数代码以包含使用严格指令的指令序言开头。

  • 如果最后一个参数是一个字符串,当作为 FunctionBody 处理时,则作为内置函数构造函数的最后一个参数提供的函数代码是严格的函数代码,该字符串以包含使用严格指令的指令序言开头。

因此,对于在“严格范围”内明确定义的函数,它们将继承严格模式:

function doSomethingStrict(){
    "use strict";

    // in strict mode

    function innerStrict() {
        // also in strict mode
    }
}

但是使用Function构造函数创建的Function不会从它们的上下文继承严格模式,所以必须有一个明确的"use strict"; 如果您希望它们处于严格模式,则声明。 例如,注意eval是严格模式下的保留关键字(但不在严格模式之外):

"use strict";

var doSomething = new Function("var eval = 'hello'; console.log(eval);");

doSomething(); // this is ok since doSomething doesn't inherit strict mode

答案是肯定的,但您可能不会在文档中找到确切的句子,而是谈论上下文。 当你定义一个函数Foo另一个函数里面BarFoo在上下文中创建Bar 如果Bar的上下文处于严格模式,则意味着Foo的上下文处于严格模式。

您可以在此处查看文档: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/Strict_mode

如果您考虑一下,没有这种行为将是不切实际的(并且没有真正的缺点)。

这也有助于使您的整个库使用严格模式而不会在多个脚本串联的情况下出现任何问题:

您还可以采取将脚本的全部内容包装在一个函数中并让该外部函数使用严格模式的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM