我的第一個問題:由于在執行任何代碼之前進行提升,javascript 需要宣告并放在函式代碼的頂部,我想知道在我下面說明的這種情況下,宣告了兩個變數,它們是這樣寫的 var a, a; ? 因為在函式代碼的頂部吊裝了?如果這樣,為什么我不在初始化之前訪問第二個變數 a 為什么我在初始化之后訪問第一個變數 a,簡而言之,在函式代碼 console.log(a) 的第 4 行 // 10 javascript 如何決定給出 10 而不是未定義,請注意,頂部有兩個同名的變數宣告。
我的第二個問題:當 javascript 掃描代碼并找到 2 個具有相同名稱的變數時,它可能會洗掉一個變數并在代碼執行中使用另一個變數。
function myFunc() { console.log(a); var a = 10; console.log(a); var a = 20; console.log(a); } myFunc();
uj5u.com熱心網友回復:
問題 1:“這樣寫時是否宣告了兩個變數:
var a, a;
答案 1:否。
JavaScript 源代碼在執行之前和在sloppy 模式下被掃描,任何數量的相同識別符號(a在本例中為“ ”)作為使用var關鍵字的變數的宣告被合并并作為函式頂部的單個變數宣告(或腳本檔案或行內元素中的頂級變數的情況下的腳本元素)。
用function關鍵字宣告的命名函式也被提升到封閉函式或腳本元素的頂部,但有一些不同:
- 提升的函式在提升時被編譯,并且可以在它們出現在源代碼中之前被呼叫。
- 宣告一個與在同一范圍內宣告的前一個函式同名的函式將替換前一個宣告。只有在同一范圍內最后一個同名函式的代碼才會被提升。
Question 2有沒有可能Javascript引擎在掃描代碼發現2個同名變數的時候,去掉一個變數,在代碼執行中使用另一個?
答案 2:是的
稍微重申一下,JavaScript 引擎不會找到兩個變數,它會找到兩個變數宣告,這些宣告在提升時只會導致變數名稱與其存盤在記憶體中的位置的單一系結——這意味著只創建一個變數。
uj5u.com熱心網友回復:
var宣告被提升到函式的頂部。- 重復宣告無效。
var宣告與賦值分開處理。
您的代碼與以下內容基本相同:
function myFunc() {
var a; // Declaration is hoisted
console.log(a);
a = 10; // Assignment is not
console.log(a);
a = 20; // Second assignment is also not
console.log(a);
}
var顯然是不直觀的,這就是為什么現代代碼避免使用它const而偶爾使用let.
uj5u.com熱心網友回復:
關于問題 1,我沒有看到任何代碼。關于問題 2,您定義了兩次相同的變數,并且在控制臺中,它會顯示兩次。因為它是 var,所以你不會得到錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/365173.html
標籤:javascript
上一篇:在javascript中創建按鈕,但onclick功能自動作業
下一篇:更改陣列中特定物件的值
