JavaScript var的作用域和提升


在ES6標准之前,var 作為唯一的聲明變量關鍵字,本篇將着重介紹var的作用域和變量提升。

 

1. var Hoisting(變量提升)

va rHoisting:使用var在函數或全局內任何地方聲明變量相當於在其內部最頂上聲明它,這種行為稱為Hoisting(提升)。

比較注意一點是此提升只是把聲明提升上來,而賦值操作還是在原先的位置。

下面以簡單的例子來說明:

示例

function foo() {
    console.log(x); // => undefined
    var x = 1;
    console.log(x); // => 1
}
foo();

相當於

function foo() {
    var x;
    console.log(x); // => undefined
    x = 1;
    console.log(x); // => 1
}
foo();

 

2. var Scoping(變量作用域)

在上面的var Hoisting(變量提升)了解到聲明會提升到函數或全局內的最頂部,那么其變量的作用域就相當於整個函數或全局。

 

3. 應用場景

了解了var的Scoping和Hoisting知識點,我們將結合幾個場景進一步了解它們。

3.1 函數內聲明相同變量

函數內聲明了一個跟外部相同名稱的變量時,函數外部的變量作用域無法延伸到此函數內。

var x = 1;

function foo() {
    var x = 2;
    console.log(x);
}
foo(); // => 2
console.log(x); // => 1

結論:foo()函數內部也聲明了一個 x 變量,此變量在 foo() 函數內的作用域覆蓋了外部 x 變量。

 

3.2 函數內聲明相同變量前調用 return 關鍵字

首先我們修改下上面的代碼,在foo()函數內聲明變量前加一個return:

var x = 1;

function foo() {
    x = 10;
    return; // 新加的代碼
    var x = 2;
}
foo();
console.log(x); // => 1

運行代碼后輸出為1。這是為什么呢?

還是因為 var 的變量提升特性,foo() 函數實際為:

 

3.3 控制語句內聲明變量

先回顧下var Hoisting特性的知識點,其中有提到"在函數或全局范圍內任何地方聲明變量,就相當於在函數或全局內的頂部聲明",任何地方也包括了控制語句內

說白了就是var沒有塊級作用域,在塊內聲明的變量也會提升到函數或全局內的頂部。

示例1:

說明:在控制語句內聲明的變量,在控制語句外面也可以使用

function foo() {
    for (var i = 1; i < 10; i++) {}
    if (true) {
        var x = 2;
    }
    console.log(i); // => 10
    console.log(x); // => 2
}
foo();

 

示例2:

說明:在控制語句內聲明一個與外部同名的變量。

var x = 1;
if (true) {
    var x = 10; // 與外部 x 變量同名
}
console.log(x); // => 10

 按照var Hoisting特性轉換為以下代碼:

var x;
x = 1;
if (true) {
    x = 10;
}
console.log(x); // => 10

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM