javascript小記——變量和函數的聲明提前

這種問題在面試中很常見,被問過,也問過別人......

請看如下代碼,說出答案並解釋爲什麼。

   var a=2;
    (function b(){
        console.log(a);
        var a=3;
        console.log(a);
    })(); 

很多人會不假思索的說 2,3。然後Ta就能看到面試官謎一樣的笑容。答案如下:

這裏寫圖片描述

在javascript中,javascript解析器將當前作用域內聲明的所有變量和函數都會放到作用域的開始處,但是,只有變量的聲明被提前到作用域的開始處了,而賦值操作被保留在原處。

如果代碼是這樣的:

var a=2;
    (function b(){
        var a;
        console.log(a);
        a=3;
        console.log(a);
    })(); 

對的,這裏就是相當於把a的聲明提前了,但是賦值並沒有提前。

上面這個例子是變量的提前聲明,如果是函數呢?我們先上例子:

isDefined();
isNotDefined();
function isDefined(){
    console.log("I am  defined");
}
var isNotDefined=function (){
    console.log("I am not defined");
}

猜猜這個結果是什麼?(^__^) ……

這裏寫圖片描述

看到了嗎?第一個結果出來了,我們看到了 I am defined,那爲什麼第二個沒有出來呢?

函數聲明的提前分爲兩種:第一種是函數聲明,第二種是把函數賦值給變量。上面的代碼中,第一個方法isDefined,它是直接聲明的,在執行過程中定義和賦值全部提前,順利執行。而第二個方法在執行過程中報錯,和第一個對比我們發現,這種情況相當於聲明被提前了,但是賦值沒有被提前,相當於undefined。這和之前的變量聲明提前的情況一樣。

總結一下:

在javascript中定義變量的時候最好還是定義在作用域內的頂部,否則不小心就會出現意料之外的結果哦!

變量的提前只是聲明提前,賦值沒有提前。

函數的聲明分爲兩種,函數直接聲明的是聲明和定義都提前,而把函數直接賦值給變量時,只是聲明提前,會在執行中報錯!!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章