一、變量聲明提升
hoisting 英[‘hɔɪstɪŋ] 美[‘hɔɪstɪŋ]
n. 起重,提升
v. 把…吊起,升起( hoist的現在分詞 )
先來看一個栗子
var cc = 'hello'; function foo(){ console.log(cc); var cc = 'world'; console.log(cc); } foo(); console.log(cc);
這裡將會輸出 undefined
、'world'
、'hello'
此處主要有兩個知識點:
1、作用域
2、變量聲明提升
JavaScript是一門解釋性語言,當代碼在解釋器(如Chrome的V8引擎)環境中執行時,會有一個預解析的過程,此時會將變量聲明和函數聲明提升至當前作用域的最前方,這個行為被稱為聲明提升(Hoisting)
再來看上面的例子,此代碼有兩層作用域,全局作用域和函數foo
作用域,而foo
中的變量聲明在預解析的過程中會被提升至函數作用域的前方,於是代碼就會變成這樣:
var cc = 'hello'; function foo(){ var cc; console.log(cc); cc = 'world'; console.log(cc); } foo(); console.log(cc);
當執行到第一個log時,變量cc只是進行了聲明,並未賦值,所以打印出的是undefined
二、 函數聲明提升
函數的聲明有兩種方式:函數聲明和函數表達式
// 函數聲明 function foo(a, b) { return a + b; } // 函數表達式 var foo = function(a, b) { return a + b; }
解析器在向執行環境中加載數據時,對函數聲明和函數表達式並非一視同仁。解析器會率先讀取函數聲明,並使其在執行任何代碼之前可用(可以訪問);至於函數表達式,則必須等到解析器執行到它所在的代碼行,才會真正被解釋執行。
當然,也可以函數聲明和函數表達式同時使用,如var a = function b(){}
,其結果是只具有函數表達式的作用,b會被自動忽略,所以只會發生變量提升效果。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。