Javascript中的函數聲明與函數表達式

兩個簡單的例子

  1. 請思考下面兩段代碼的輸出結果
add() // 0
    function add () {
      return '函數聲明'
    }
複製代碼
add () // add is not a function
    var add = function () {
        return '函數表達式'
    }
複製代碼

以上兩個例子中,第一段代碼中函數聲明式add存在變量提高,實際上的執行順序爲:bash

var add
 add()
   function add () {
     return '函數聲明'
   }
複製代碼

很好奇的是爲何一樣都是函數,第二段函數表達式中彷佛沒有進行函數變量提高,再看一個例子:函數

var add = function () {
    return 1
  }
  add() // 1
複製代碼

實際上,函數表達式定義後,並不會進行變量提高,只是會在執行的時候運行,因此纔會出現此種狀況。ui

  1. 再來看一段代碼
var add = function () {
   return 0
 }
 function add () {
   return 1
 }
 add() // 0
複製代碼

這裏實際上也是存在變量提高的,只不過是兩種類型的提高,一種是var變量提高,一種是function提高,在運行以前,會提早生成執行上下文,執行上下文解析的規則則是:function早於var被提高,因此上例就很好理解了,是由於變量add覆蓋了函數add。spa

總結了如下幾點:code

  • 在執行上下文中存在變量提高,變量提高又分爲普通變量提高與function提高,function早於其餘普通變量;
  • 函數表達式 定義的函數不存在變量提高,只會在執行的時候運行。函數聲明才存在變量聲明。
相關文章
相關標籤/搜索