首頁 >web前端 >js教程 >js的函數宣告和函數表達式的分析

js的函數宣告和函數表達式的分析

不言
不言原創
2018-07-14 17:40:561689瀏覽

這篇文章主要介紹了關於js的函數宣告和函數表達式的分析,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

1.定義

在javascript中我們定義函數有以下兩種方式:

函數宣告

  function say(){
     console.log('函数声明');
  }

函數表達式

   var say = function(){
      console.log('函数表达式');
   }

2.實例解析

在平時開發中,它們有著難以察覺的差別,我們看下下面的例子:

    say();
    var say = function(){
          console.log('函数表达式');
    }
    say();
    function say(){
     console.log('函数声明');
    }
    say();

可以先在腦海中想一下答案,執行結果是:

函数声明
函数表达式
函数表达式

來,我們分析這個結果:

1.第一次呼叫say函數時,函數還未被定義,那為什麼可以印出「函數宣告」這個值呢?原因在於

javascript解釋器中存在一種變數宣告被提升的機制,也就是說函數宣告會被提升到作用域的最前面,即使寫程式碼的時候是寫在最後面,也會被提升至最前面。
而用函數表達式創建的函數是在運行時進行賦值,並且要等到表達式賦值完成後才能調用

因此,即使函數還未被定義,但是函數聲明已經被提升到最前面了,上面那段程式碼相當於:

    var say; //变量被提升,此时的值为undefined
    say();// 函数被提升,输出“函数声明”
    var say = function(){
          console.log('函数表达式');
    }
    say();
    function say(){
     console.log('函数声明');
    }
    say();

從下面兩個的對比,更能理解「函數宣告提升」這個概念:
1.

var say;
console.log(say);
say();
function say(){
   console.log('函数声明');
}

输出:
f say(){
   console.log('函数声明');
}
函数声明

2.

var say;
console.log(say);
say();
var say = function(){
   console.log('函数表达式');
}

输出:
undefined
Uncaught TypeError: say is not a function
    at <anonymous>:3:1

2.第二次呼叫say函數時,我們可以先簡單理解為此時的函數表達式覆蓋了函數宣告,因此輸出了'函數表達式',然而到了第三次呼叫say函數時,此時印出來的竟然還是'函數表達式'? ?為什麼後面的函數宣告沒有覆寫前面的函數表達式呢?其實在運行時由於函數宣告提升的原因,實際上運行的順序是類似於這樣的:

function say() {
    console.log('函数声明');
}//因为函数声明提升,所以在最前面运行了
say();
var say = function() {
    console.log('函数表达式');
}
say();
say();

#3.總​​結

#1.函數宣告`在JS解析時進行函數提升,因此在同一個作用域內,不管函數宣告在哪裡定義,函數都可以進行呼叫。
2.函數表達式的值是在JS運行時確定,並且在表達式賦值完成後,該函數才能調用

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

如何透過js將偽數組轉為陣列

#如何使用JS求數組差集的方法

以上是js的函數宣告和函數表達式的分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn