規範的相關部分:
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 呼叫是直接調用(見15.1.2.1.1)的eval函數是 開始包含在嚴格的模式代碼中。
功能碼是一個FunctionDeclaration,FunctionExpression的一部分,或者存取器PropertyAssignment是嚴格功能 代碼,如果它的FunctionDeclaration,FunctionExpression,或 PropertyAssignment包含在嚴格模式代碼或如果函數 代碼開始於一個指令序言包含使用嚴格的 指令。
- 被作爲最後一個參數的內置函數的構造提供
功能代碼是嚴格函數代碼,如果最後一個參數是一個 String當處理的函數體與包含使用嚴格的一個指令 序章開始指示。
所以對於一個「嚴格的範圍」內明確定義的功能,他們將繼承嚴格模式:使用Function
構造函數創建
function doSomethingStrict(){
"use strict";
// in strict mode
function innerStrict() {
// also in strict mode
}
}
但功能不繼承嚴格模式他們的上下文,所以如果你希望他們在嚴格模式下,必須有明確的"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
無論如何,您可能要考慮在每個函數中顯式聲明嚴格模式,否則當代碼被重構時會留下錯誤空間。 –