變量提高想必你們都比較熟悉了,那麼什麼是函數聲明提高呢?
首先咱們來了解下經常使用的兩種函數定義方式:
1. 函數聲明
2. 函數表達式javascript
下面來看下兩種方式定義函數。
函數聲明語法定義函數java
function fn (n) { return n * 2 }
函數表達式定義函數函數
var fn = function (n) { return n * 2 }
*那麼兩種方式定義函數有什麼區別呢?*
**對於函數聲明與函數表達式兩種定義函數的方式,解析器會率先讀取函數聲明,並使其在執行任何代碼以前可用,*這個過程叫函數聲明提高*,而函數表達式則是在真正執行到他所在的代碼行,纔會被解釋執行。**
看下例子就明白了:spa
fn(2) function fn (n) { return n * 2 }
上面的代碼徹底能夠正常運行,由於在代碼開始執行以前,解析器已經進行了函數聲明提高,將函數聲明添加到執行環境中。
相反下面的代碼則會報錯:對象
fn(2) var fn = function (n) { return n * 2 }
由於,函數聲明位於一個賦值語句中,實際上,這裏進行的是**變量提高**,也就是變量fn被提高到頂部,但並未被初始化爲函數對象,在執行fn(2)的時候,fn變量爲undefined,代碼執行到這裏就會報錯,不會繼續往下執行了。blog
總結:
函數聲明提高指,當用函數聲明語法定義函數時,解析器會在代碼執行以前讀取並將函數聲明添加到執行環境,使其在執行任何代碼以前可用。ip