2016-08-14 80 views
0
function foo(a) 
{ 

    var b = a*2; 
    function bar(c) 
    { 

    console.log(a,b,c); 
    var c= 3; 
    } 
    bar(4); 
    var c= 4; 
    var a= 2; 
} 

foo(1); 

爲什麼c不是3?儘管var c = 3,但在bar()的詞彙範圍中定義,爲什麼即使在bar()調用下定義var c = 4,也會選擇var c = 4? 請幫我理解如何挑選這些值並將其分配給變量。變量的查找範圍

+0

使用[this search](/ search?q =%5Bjs%5D + variable + hoisting)可以找到關於此主題的很多問題和答案,例如[this one](http://stackoverflow.com/questions)/33540709/javascript-variable-hoisting)和其他人的**羣**,包括我剛標記的複製目標(在這種情況下,它是全局的,但答案是相同的)。 –

回答

0
  1. c在執行賦值之前不會變爲3,即在日誌輸出之後。

  2. var c不會在這裏宣佈一個新的變量,因爲你已經有c作爲參數的函數(但你是正確的,如果它這樣做了,聲明將被「懸掛」 ---那就是術語你想尋找在這裏得到好的答案)。


爲什麼即使它被定義的欄下方VAR C = 4被拾取()調用?

它不是「挑選」。在你的函數中你看到4,因爲c是函數參數,你可以把它叫做bar(4)

來自外部函數的c正在被內部函數中的另一個c的本地聲明遮蔽,並且不可訪問。