瀏覽器解讀代碼時,會按照以下順序進行加載狡蝶,先是對var 聲明的變量進行預處理庶橱,只聲明不復制,之后對于函數(shù)聲明進行提升贪惹,并把函數(shù)的內(nèi)容打印到函數(shù)名的后面苏章,最后對于參數(shù)進行處理。
之后瀏覽器按照代碼加載順序奏瞬,逐行解析代碼枫绅,遇到表達式再開始賦值,同時修改倉庫里面的值硼端。
function a(b){
alert(b);
function b(){
alert(b); //此處彈出function b
};
b(); //此處彈出 function b
}
a(1);
var n=0;
function a(){
var n=10;
function b(){
n++;
alert(n);
}
b();
return b;
}
var c=a(); //此處執(zhí)行了一遍a函數(shù) -->11
c(); // -->12
alert(n) // -->0
alert(a);
var a=1;
alert(a);
function a(){
alert (2);
}
alert(a);
function a(){
alert(4)
}
alert(a);
不同script添加的js文件并淋,可以建立向前方的依賴關(guān)系,但是之前的不能取到后方的內(nèi)容珍昨。由此可以總結(jié)出县耽,對于此種情況下的js作用域句喷,是自上而下的,類似于函數(shù)中由內(nèi)及外的作用域關(guān)系兔毙。
var a=1;
function fn1(){
alert (a);
var a=2;
}
fn1(); //函數(shù)內(nèi)聲明的a在作用域上優(yōu)于父級函數(shù)的聲明唾琼,但是由于只聲明 未賦值,因此彈出undefine澎剥;
alert(a); //1
var a=1;
function fn1(a){
alert(a);
a=2;
}
fn1(); // undefine 此時a應該為傳遞進的參數(shù)
alert(a); //1
不論函數(shù)還是變量父叙,都是有作用域的,而預解析只能是在同一作用域下提前解析肴裙。
作用域是看的函數(shù)聲明或者變量所定義的位置趾唱,而不是調(diào)用它們的位置。
function fn1(){
var a='eva';
fn2();
}
function fn2(){
alert(a);
}
fn1(); // 報錯 由于fn2所在的作用域中沒有聲明a
function fn1(){
var a='eva';
fn2(a);
}
function fn2(a){
alert(a)
}
fn1(); //彈出eva