规范的相关部分:
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