7

这是我的代码,似乎表明答案是肯定的 - 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'

4

2 回答 2

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

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

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

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

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
于 2013-10-02T11:16:40.123 回答
2

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

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

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

这也有助于使您的整个库在连接多个脚本时使用严格模式而不会出现任何问题:

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

于 2013-10-02T11:18:48.260 回答