摘自《你不知道的JavaScript上卷》KYLE SIMPSON著
變量提升
引擎會(huì)在解釋 JavaScript 代碼之前首先對(duì)其進(jìn)行編譯。編譯階段中的一部分工作就是找到所有的聲明,并用合適的作用域?qū)⑺鼈冴P(guān)聯(lián)起來。
所以,包括變量核函數(shù)在內(nèi)的所有聲明都會(huì)在任何代碼被執(zhí)行前首先被處理。
var a = 2;
JavaScript 實(shí)際上會(huì)將其看成兩個(gè)聲明:var a;a = 2;。第一個(gè)定義聲明是在編譯階段進(jìn)行的,第二個(gè)賦值聲明會(huì)被留在原地等待執(zhí)行階段。
函數(shù)提升
函數(shù)聲明會(huì)被提升,但是函數(shù)表達(dá)式卻不會(huì)被提升。
foo();
bar();
var foo = function bar(){
//...
}
會(huì)被理解為:
var foo;
foo();
bar();
foo = function() {
var bar = ...self...
//...
}
函數(shù)優(yōu)先
函數(shù)會(huì)被優(yōu)先提升,然后才是變量。
【1】
foo(); //1
var foo;
function foo(){
console.log(1);
}
foo = function(){
console.log(2);
}
【2】
var a=1;function a(){} //1
var a;function a(){} //f a(){}
【3】
foo();//3
function foo(){
console.log(1);
}
var foo = function(){
console.log(2);
}
function foo(){
console.log(3);
}
【4】
foo(); //'b' 根據(jù)書上寫的。一個(gè)普通塊內(nèi)部的函數(shù)聲明通常會(huì)被提升到所在作用域的頂部。 chrome的結(jié)果是foo is not a function
var a = true;
if(a){
function foo(){console.log('a');}
}else{
function foo(){console.log('b');}
}