2013-10-02 30 views
7

這裏是我的代碼似乎表明,答案是肯定的 - http://jsfiddle.net/4nKqu/嚴格模式(「use strict」;)如何被函數繼承?

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 呼叫是直接調用(見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 
2

答案是肯定的,但你可能不會發現該文件中的具體句子,相反,它背景談話。 當您在另一個函數Bar內定義函數Foo時,會在Bar的上下文中創建Foo。如果Bar的上下文處於嚴格模式,則表示Foo的上下文處於嚴格模式。

你可以看一下這裏的文檔:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/Strict_mode

如果你想想看,沒有這種行爲將是非常不切實際的(並沒有真正的缺點的話)。

這也有助於讓你的整個音樂庫中的幾個腳本級聯的情況下,使用嚴格的模式沒有任何問題:

您也可以包裝一 腳本的全部內容的的方法功能並具有該外部功能使用嚴格模式。