本章的標題特別的簡介,就這倆字。我想你們都能想到這是講關於變量提高問題的node
var a = 2;
複製代碼
以前一開始就提到過,這句代碼,可能你認爲是一個操做,可是JS引擎可不這麼認爲。其中var a;這句代碼扔給編譯器,而a = 2;則留給引擎處理。而編譯是在代碼執行以前,因此這就形成了變量的提高。瀏覽器
console.log(a,b) // undefined unfined
var a = 2;
var b = function(){ //... }
複製代碼
可是還有這麼種狀況bash
demo() // 函數正常執行
function demo(){
//...
}
複製代碼
哎喲?啥意思嘛?你上個例子僅僅提高了undefined,這回整個函數都上去了?函數
區分函數表達式和函數聲明是十分有必要的spa
變量和函數在內的全部聲明都會在執行前被提高到頂部。可是。只有聲明自己會被提高,而賦值操做和其餘運行邏輯都會保留在原地。這也能夠解釋上面的狀況了。code
書上總結的很好,我再說一下本身的想法對象
首先在代碼執行以前,都會有一個預編譯的過程。這個過程,分四部:開發
因爲我上述第四點的存在,因此會有如下狀況編譯器
foo() // 不會報錯,打印1
function foo(){ console.log(1) }
var foo = 123
複製代碼
個人表述是:函數聲明會覆蓋掉以前已經提高的var fooit
書上的觀點是函數優先,意思是:函數會優先提高,提高以後呢,再碰到var foo 直接忽略掉了。
二者觀點一摸同樣,只是表述方式不一樣,看官隨意。
我已經提交了,結果想起個重點沒和你們分享,若是你對本身變量提高知識方面比較自信,看一下這個demo:
console.log(demo) // undefined
var a = true
if(a){
function demo(){ console.log(1) }
}else{
function demo(){ console.log(2) }
}
複製代碼
GoogleChrome打印的是undefined
safari打印函數體 function(){console.log(2)}
node直接跑js文件 打印undefined
按我掌握的知識來說,我以爲safari的結果纔是正確的。可是GoogleChrome做爲前段開發的標配來說,我也不敢說他是錯的,並且node跑出來的結果也是undefined。
這個demo我沒有整明白,可是隻要有safari的結果,就說明本身掌握的知識沒問題,多是因爲瀏覽器內核或者什麼因素形成的這個結果吧。這個問題請教了字節跳動的大佬才用safari試了一下,要不一直在GoogleChrome鑽着估計要瘋,感謝!