簡體   English   中英

為什么我不能在這個簡單的函數中訪問這個變量?

[英]Why I cannot access this variable inside this simple function?

我是 Javascript 新手,我不明白范圍在以下代碼中是如何工作的:

//Code n°1:

let num = 1;

function test(){
    console.log(num);
}

test()       //As I expected I get in console "1"
//Code n°2:

let num = 1;

function test(){
    let num = 2;
    console.log(num);
}

test()       //As I expected I get in console "2"

但問題是:

//Code n°3:

let num = 1;

function test(){
    console.log(num)
    let num = 2;
    console.log(num);
}

test()       //I expected to get in console "1" and then "2" but instead I get an error.

當我在瀏覽器中運行代碼 n° 3 時,我收到此錯誤:未捕獲的 ReferenceError:在初始化之前無法訪問詞法聲明 'num'

如果我查看代碼 1 和 2,我想在運行代碼 3 后,我將在控制台中獲得數字 1,然后是數字 2。但這並沒有發生。 為什么?

非常感謝!

JavaScript 異常“在初始化之前無法訪問詞法聲明‘變量’”發生在詞法變量在初始化之前被訪問時。 這發生在任何塊語句中,當 let 或 const 聲明在定義之前被訪問時。

當“測試函數”被調用時,函數體被執行。 當它到達 'console.log(num)' 時,它開始在測試函數 scope 中搜索 'num variable declaration'(或 'num assignment' 或 'num reassignment)。 所以它在下一行找到變量聲明。 搜索變量的優先級是:

  1. 當前范圍
  2. 關閉
  3. 范圍鏈

因此,當在當前范圍內找到變量聲明時,不會繼續搜索范圍鏈。 (它不會在全局范圍內搜索 num 變量。)

我想這就是錯誤的原因,但由於我是 javaScript 的新手,我不完全確定。

如果你在沒有重新聲明的情況下初始化變量,它會正常工作,現在如果你重新聲明變量,那么這個錯誤將發生在letvar ,因為在同一范圍內,它被之前的console.log()調用。 不建議你重新聲明let變量,如果你需要,不要在前面的語句中使用相同的,注意如果你在第一個console.log()上注釋,代碼會再次工作,這正是發生對於此范圍內變量的生命周期,在這種情況下,

let num = 1; function test(){ console.log(num) let num = 2; console.log(num); } test()

因為 JavaScript 中的函數和用 var 聲明的變量被提升,移動到函數/詞法塊的頂部。

但是讓關鍵字尊重詞匯流。 它在聲明變量的地方固定變量。

console.log 嘗試訪問流中聲明的變量。 因此,手動將您的 let 聲明移至 de console.log 之上或將其更改為 var let num = 2; 讓 javascript 引擎首先自動移動它。

var num = 1;

function test(){
    let num = 2;
    console.log(num);
}

test() 

或者

var num = 1;

function test(){
    console.log(num)
    var num = 2;
    console.log(num);
}

test() 

或者,要訪問全局 var num,它被來自測試主體、var 或 let 的聲明所掩蓋,無論

var num = 1;

function test(){
    console.log(num)
    //let num = 2;
    console.log(num);
}

test() 

暫無
暫無

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

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