簡體   English   中英

JavaScript函數和變量范圍

[英]Javascript function and variables scope

快速提問,因為今天有一件事使我感到困惑。 以下是一段JavaScript代碼:

var a = [1, 2, 3, 4];

function init() {

    console.log(a);

    if (false) {
        var a = [9, 8, 7];
    }
}

init();

這個簡單的代碼在JS控制台中記錄“未定義”。 我發現原因是第5行:

var a = [9, 8, 7];

在這種情況下,如果沒有單詞var ,它將記錄正確的結果[1, 2, 3, 4]

我的問題是:為什么JavaScript解釋器會考慮永遠不會執行的代碼?

播放示例: http : //jsfiddle.net/5DPCz/

您不能在JavaScript的函數中間聲明變量; 所有變量都有功能范圍。 實際上,變量聲明被“懸掛”在函數的頂部。 無論函數在函數中的何處聲明,您的函數都只能訪問局部變量a

這就是為什么JSLint(和大多數其他整理工具)會建議您將所有變量聲明移到函數頂部的原因; 無論如何,這就是有效地編寫它們的地方。

無論您在函數中的什么位置放置var a ,您的代碼都可以通過以下方式有效執行:

var a = [1, 2, 3, 4];

function init() {
    var a;

    console.log(a);

    if (false) {
        a = [9, 8, 7];
    }
}

init();

您的示例等效於

var a = [1, 2, 3, 4];

function init() {
    var a;
    console.log(a);

    if (false) {
        a = [9, 8, 7];
    }
}

init();

現在您可以看到為什么它顯示undefined 尚未為函數本地的a分配一個值。

如果刪除var ,則將其變成

var a = [1, 2, 3, 4];

function init() {
    console.log(a);

    if (false) {
        a = [9, 8, 7];
    }
}

init();

所以, a在功能,現在指的是a在全局范圍內。

暫無
暫無

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

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