我只是想知道為什么第三個 console.log 的輸出是 2?我知道 var 陳述句被提升(沒有它們的值初始化)到它所屬的全域或函式范圍的頂部,即使它位于 with 或 catch 塊內。我目前仍在學習 javascript,沒有人可以正確地向我解釋,因為我期望最后 2 個 console.log 的值是未定義的。為什么第二個 console.log 未定義,最后一個 console.log 輸出為 2?為什么最后一個能夠訪問 catch 塊內的 y 值?
(function () {
try {
throw new Error();
} catch (x) {
var x = 1, y = 2;
console.log(x);
}
console.log(x);
console.log(y);
})();
uj5u.com熱心網友回復:
兩者都x,y被吊起。var是函式作用域,因此它們將在塊頂部沒有初始化的情況下被提升。
(function () {
var x,y;
try {
throw new Error();
} catch (x) {
x = 1;
y = 2;
console.log(x);
}
console.log(x);
console.log(y);
})();
catch由于 catch(x) ,您在塊中有一個區域變數。當您x=1在catch塊內執行時,您只是更改本地的值x(作為 catch 塊的引數的值)。內部x陰影外部x。外面x依舊undefined。更新y將更新外部的,因此您的輸出。
uj5u.com熱心網友回復:
解釋與變數提升和賦值有關。
在 catch 塊中,變數y被提升到匿名函式的函式級別
由于您的 catch 塊寫為“ catch (x) ”,因此var陳述句將其在 catch 塊中的本地值x分配給1。這就是第一個console.log(x)回傳1的原因。
撰寫代碼的方式,變數x在函式級別上未定義,導致第二個console.log(x)回傳undefined。
變數y 被提升到函式級別(盡管賦值出現在var行中的 catch 塊中。因此,catch 塊中的var賦值在函式級別將y的值存盤為2。
這就是它在您的第三個console.log陳述句中顯示為2的原因。
請參閱以下代碼示例,其中在 try/catch 塊中引入了z變數
示例 #1:
(function () {
try {
var z='before';
throw new Error();
var z='after';
} catch (x) {
var x = 1, y = 2
console.log(x);
}
console.log(x);
console.log(y);
console.log(z);
})();
其中console.log(z)將以 ' before '回應
示例 #2:
(function () {
try {
var z='before';
throw new Error();
z='after';
} catch (x) {
var x = 1, y = 2, z='catch'
console.log(x);
}
console.log(x);
console.log(y);
console.log(z);
})();
其中console.log(z)將回應' catch '
uj5u.com熱心網友回復:
在 JSvar中具有函式作用域,因此您可以訪問y函式中的任何位置。因為x你有兩個單獨的變數,一個是 in catch(x),第二個是在內部 catch 中初始化的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467360.html
標籤:javascript
上一篇:你如何正確使用來自HOC的帶有事件處理程式道具的React.memo?
下一篇:如何將文本添加到串列元素?
