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

时间:2013-10-02 11:12:32

标签: javascript ecmascript-5 strict use-strict

这是我的代码似乎表明答案是肯定的 - 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'中定义的所有闭包和函数?

2 个答案:

答案 0 :(得分:8)

规范的相关部分:

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代码,如果它以包含Use Strict Directive的Directive Prologue开头,或者是对eval的调用   是对eval函数的直接调用(见15.1.2.1.1)   包含在严格模式代码中。

  •   
  • 作为FunctionDeclaration,FunctionExpression或访问者PropertyAssignment一部分的函数代码是严格函数   代码,如果它的FunctionDeclaration,FunctionExpression或   PropertyAssignment包含在严格模式代码或函数中   代码以包含Use Strict的Directive Prologue开头   指令。

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

  •   

因此,对于在'strict scope'中明确定义的函数,它们将继承严格模式:

function doSomethingStrict(){
    "use strict";

    // in strict mode

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

使用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

答案 1 :(得分:2)

答案是肯定的,但您可能无法在文档中找到确切的句子,而是在讨论上下文。 在另一个函数Foo中定义函数Bar时,会在Foo的上下文中创建Bar。如果Bar的上下文处于严格模式,则表示Foo的上下文处于严格模式。

您可以在此处查看文档:{​​{3}}

如果你考虑一下,没有那种行为真的是不切实际的(而且没有真正的缺点)。

这也有助于使整个库使用严格模式,在连接多个脚本的情况下没有任何问题:

  

您还可以采用包装整个内容的方法   函数中的脚本,并且该外部函数使用严格模式。