2016-09-28 38 views
1

我正在學習JS中的詞彙範圍和執行上下文,並且遇到了一個問題。爲什麼在引用外部環境時不能訪問這個特定的變量?

我對關鍵字this的理解可能有限,但我發現它引用了任何函數的當前執行上下文中的所有變量。

考慮這個例子:

function b(){ 
    console.log(this); 
} 
var myVar = 1; 
b(); 

在這裏,我會得到一個控制檯日誌myVar的,將被分配到現在價值1

這個例子:

function a(){ 
    function b(){ 
    console.log(this); 
    } 
    var myVar = 2; 
    b(); 
} 
var myVar = 100; 
a(); 

當函數b被調用時,我看到myVar的引用,它被分配到100.爲什麼沒有myVar的引用被賦值爲2?

這不是指當前函數的詞法環境嗎?在這種情況下,函數b被包含在函數a中而不是全局環境中。

回答

4

您對this的理解是完全錯誤的。

this的值取決於(通常)函數的調用方式。 (詳情請見How does the 「this」 keyword work?)。

如果你是:

  • 你的JS是不是在strict mode運行(這應該是)
  • 調用函數時,沒有明確的背景下
瀏覽器
  • ...然後this將是window對象。


    通常,聲明一個變量時,它只存在於它聲明的範圍內。它不是任何物體的財產。

    有一個例外:

    當一個變量在全局範圍內聲明(即外部的任何功能的或無letvar在函數內部),那麼它也變爲window對象的屬性。


    你看到的效果是這兩件事的結合。

    b();沒有上下文,所以thiswindowvar myVar = 100;不屬於任何函數,因此是window的全局屬性。

  • +0

    在函數a的上下文中是不是b?因此函數b作爲函數a中的外部環境的參考? –

    +0

    @ user3882106 - 不會。正如我所說的,上下文是由函數的調用方式決定的,而不是聲明的地方。請參閱http:// stackoverflow。com/questions/3127429/how-this-this-keyword-work。不要混淆上下文和範圍。 – Quentin

    相關問題