【JavaScript】變量提高以及var對變量提高的

JavaScript聲明過的變量提高每每會影響到咱們對變量的正常獲取,因此特寫此文,以便之後翻閱。javascript

什麼是變量提高

//變量聲明提高
function test() {
    var a = "1";
    var f = function(){};
    var b = "2";
    var c = "3";
}

//上述代碼等價於
function test() {
    var a,f,b,c;
    a = "1";
    f = function(){};
    b = "2";
    c = "3";
}

js中定義變量有兩種狀況:(注意在方法外不加var是不能定義變量的,出現xx is not defined)java

  1. 都加var,在方法內則是局部變量,在方法外則是全局變量。
  2. 在方法內,加var爲局部變量,不加var則是全局變量(在執行當前方法以後)

變量提高案例

案例1

因爲test1函數裏面定義了變量a,因爲git

var a = 'I\'m a in all'

function test1 () {
    console.log(a)
    console.log(window.a)

    var a = 'I\'m a in test1'
    console.log(a)
}
    
test1()

上述代碼至關於函數

var a = 'I\'m a in all'

function test1 () {
    var a
    console.log(a) // undefined
    console.log(window.a) // I'm a in all(由於window指的是全局環境)

    a = 'I\'m a in test1'
    console.log(a) // I'm a in test1
}
    
test1()

案例2

var a = 'I\'m a in all'

function test2 () {
    console.log(a) // I'm a in all

    a = 'I\'m a in test2' // 這裏原本就是賦值,因此上邊的a會輸出全局變量
    console.log(a) // I'm a in test2
}

test2()

案例3

function test3_1 () {
    console.log(a) // 報錯(Uncaught ReferenceError: a is not defined),阻斷如下代碼的運行

    a = 'I\'m a in test3'
    console.log(a) // 不輸出
}
console.log(a)
test3_1()

console.log(a) // 不輸出
function test3_2 () {
    a = 'I\'m a in test3' // 全局變量(可是在方法執行後生效)
    console.log(a) // I'm a in test3
}

// console.log(a) // 若是在方法執行前打印,仍是會報錯(Uncaught ReferenceError: a is not defined),阻斷如下代碼的運行

test3_2()

console.log(a) // I'm a in test3(原本沒有全局變量a,當test3運行時,定義了一個全局變量a,因此這裏會輸出)

我的博客:午後南雜gitlab

相關文章
相關標籤/搜索