这是我的代码似乎表明答案是肯定的 - 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'
中定义的所有闭包和函数?
答案 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}}
如果你考虑一下,没有那种行为真的是不切实际的(而且没有真正的缺点)。
这也有助于使整个库使用严格模式,在连接多个脚本的情况下没有任何问题:
您还可以采用包装整个内容的方法 函数中的脚本,并且该外部函数使用严格模式。