簡體   English   中英

函數如何繼承嚴格模式(“use strict”;)?

[英]How is strict mode ("use strict";) inherited by functions?

這是我的代碼,似乎表明答案是肯定的 - 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'函數中定義的所有閉包和函數?

規范的相關部分:

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 的調用是對包含在嚴格模式代碼中的 eval 函數的直接調用(參見 15.1.2.1.1),則它是嚴格的 eval 代碼。

  • 作為 FunctionDeclaration、FunctionExpression 或訪問器 PropertyAssignment 的一部分的函數代碼是嚴格函數代碼,如果其 FunctionDeclaration、FunctionExpression 或 PropertyAssignment 包含在嚴格模式代碼中,或者如果函數代碼以包含使用嚴格指令的指令序言開頭。

  • 如果最后一個參數是一個字符串,當作為 FunctionBody 處理時,則作為內置函數構造函數的最后一個參數提供的函數代碼是嚴格的函數代碼,該字符串以包含使用嚴格指令的指令序言開頭。

因此,對於在“嚴格范圍”內明確定義的函數,它們將繼承嚴格模式:

function doSomethingStrict(){
    "use strict";

    // in strict mode

    function innerStrict() {
        // also in strict mode
    }
}

但是使用Function構造函數創建的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

答案是肯定的,但您可能不會在文檔中找到確切的句子,而是談論上下文。 當你定義一個函數Foo另一個函數里面BarFoo在上下文中創建Bar 如果Bar的上下文處於嚴格模式,則意味着Foo的上下文處於嚴格模式。

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

如果您考慮一下,沒有這種行為將是不切實際的(並且沒有真正的缺點)。

這也有助於使您的整個庫使用嚴格模式而不會在多個腳本串聯的情況下出現任何問題:

您還可以采取將腳本的全部內容包裝在一個函數中並讓該外部函數使用嚴格模式的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM