簡體   English   中英

函數中的全局變量不更新

[英]Global variable in function not updating

我寫這個簡單的程序來更新JS吊裝的價值。 但根據我的理解,全局x需要更新,但它沒有更新。

x = 5;
var w = function(){
    x = 7
    var x;
    console.log(x);
    x = 10;
    console.log(x);
};
w();
console.log(x);

輸出:

  • 7
  • 10

任何人都可以更詳細地解釋為什么它不更新全局x?

Javascript工作於值的引用,所以當我寫x = 7時,它應該更新全局x。 但它不是! 所以我只是想為什么x = 7不起作用?

謝謝!

在函數內部聲明變量的那一刻,由於作用域規則從內到外的工作方式,它掩蓋了全局變量。 因此,首先找到函數級var x變量,而不是您期望的全局變量。

JS轉換了你的函數:

function(){
    x = 7
    var x;
    console.log(x);
    x = 10;
    console.log(x);
}

對此:

function(){
    var x;
    x = 7
    //var x;
    console.log(x);
    x = 10;
    console.log(x);
}

關於更新x = 7然后聲明var x的問題,讓我再解釋一下。 Javascript代碼不僅僅是執行,還有一個編譯階段。 在這個階段,var聲明在函數內部查看(除了發生的許多其他事情,但我只是堅持手頭的問題)。 如果找到,它們將移動到函數的頂部。 這稱為吊裝。 此時您可以認為您的代碼已被JS修改(var聲明和賦值的順序現在無關緊要)。 如果您只是認為代碼被解釋,那么訂單很重要,但正如我所說,由於編譯階段,提升發生並且沒有用這些術語思考會導致您產生混淆。 一旦你從編輯,提升角度看它,事情看起來更清晰。

希望能幫助到你! 如需進一步學習,請閱讀/收聽有關javascript權限的Kyle Simpson。

因為您在函數的本地范圍內重新聲明了x 那是你給的10而不是全局的那個。

拋棄var x; 它會起作用。

x = 5;
var w = function(){
    x = 7
    // var x;
    console.log(x);
    x = 10;
    console.log(x);
};
w();
console.log(x);

話雖這么說,令你感到困惑的是吊裝

提升是JavaScript將所有聲明移動到當前范圍頂部(到當前腳本或當前函數的頂部)的默認行為。

x = 5;
var w = function(){
    x = 7
    var x; // this is moved to the top of the local scope
    console.log(x);
    x = 10;
    console.log(x);
};
w();
console.log(x);

永遠記住,局部變量具有最高優先級,並且請對全局變量和局部變量使用適當的命名約定,從而防止您導致此類錯誤。 在巨大的項目中很難被發現。

暫無
暫無

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

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