首頁  >  問答  >  主體

javascript - var和function關鍵字

var a = 1;

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

這幾行JS程式碼運行會報錯,但原因是什麼?求大神講解

仅有的幸福仅有的幸福2711 天前459

全部回覆(5)我來回復

  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-19 10:31:08

    函數做為javascript的第一個公民,所以在此處存在函數提升。上述程式碼最後的實現和以下效果是一樣的

    function a()
    {
        console.log(a);
    };
    var a = 1;
    a();
    

    這樣會導致原有的函數名被覆蓋。

    回覆
    0
  • PHP中文网

    PHP中文网2017-05-19 10:31:08

    標識符重複了啊 你已經給a宣告成一個變數了

    回覆
    0
  • 高洛峰

    高洛峰2017-05-19 10:31:08

    先說一點 js 看到 var a = 1 是 分兩步驟來解析,第一 把var a 提升到目前作用域頂端,然後依序往下解析,知道a = 1 開始賦值

    這就是 變數 跟 函數重名的問題,簡單來說 js引擎解析順序是這樣的
    1.變數個函數宣告提升到目前作用域頂端 → var a ↑ 和 `function a()
    {

    console.log(a);

    }`
    2.然後解析剩下的程式碼 `a=1;
    a()`,

    回覆
    0
  • 怪我咯

    怪我咯2017-05-19 10:31:08

    這是因為函數宣告會提前

    var a = 1;
    function a()
    {
        console.log(a);
    };
    a();

    1)函數宣告會置頂
    2)變數宣告也會置頂
    3)函數宣告比變數宣告更置頂:(函數在變數上方)
    4)變數和賦值語句一起書寫,在js引擎解析時,會將其拆成聲明和賦值2部分,聲明置頂,賦值保留在原來位置
    5)聲明過的變數不會重複聲明

    就會相當於下面的這個樣子

    var a = function ()
    {
        console.log(a);
    };
    var a = 1;
    
    a();

    希望幫你~

    回覆
    0
  • 漂亮男人

    漂亮男人2017-05-19 10:31:08

    很多人都提到了是變數提升的問題,但解釋的不太對。 var提升是拆開來提升的,函數是整個提升的。 fYI

    所以應該是這個樣子:

    var a;
    function a ()
    {
        console.log(a);
    };
    a = 1;
    a();

    回覆
    0
  • 取消回覆