關於JS作用域問題,是面試的時候面試官樂此不疲的面試題,有時候確實是令人抓狂,今天看到一個講解這個問題的視頻,明白了那些所謂的“原理”頓時有種豁然開朗的感覺~~~
1.js作用域(全局變量,局部變量)內部可以訪問外部,但外部的不能訪問內部的
var a=10; function aaa(){ alert(a); }; aaa(); //a 為外部變量即全局變量,所以可以直接訪問到 結果為10
function aaa(){ var a=10; }; aaa(); alert(a); //a 為函數aaa()內部變量量即局部變量,所以無法訪問到
var a=10; function aaa(){ alert(a); }; function bbb(){ var a=20; aaa(); } bbb(); //結果為10,因為aaa()函數不能訪問到bbb()里面的局部變量,所以訪問到的是a=10,這個全局變量。
2.不用var 定義變量時,會默認為是全局變量(不規范,不推薦)
function aaa(){ a=10; } aaa(); alert(a); //結果為10; //等價於: var a; function aaa(){ a=10; }; aaa(); alert(a);
//給未聲明的變量賦值,此變量就會變成全局變量;var a=b=10; 可以解析成 b=10;var a=b; 也就是b為全局變量,a為局部變量,所以外部訪問a訪問不到,訪問b結果為10;
所以為了避免出現這種隱患,我們在定義變量的時候把所有要定義的變量都加上var;
function aaa(){ var a=b=10; }
aaa();
alert(a);//結果為,無法訪問到
alert(b);//結果為10;
3.變量的查找是就近原則去尋找,定義的var變量;第二點,變量的聲明被提前到作用域頂部,賦值保留在原地,如下dome;
function aaa(){ alert(a); var a=20; } aaa(); //結果為:undefined
/**************/
var a=10;
function aaa(){
alert(a);
var a=20; } aaa(); //結果為:undefined
可以解析為是:
var a=10;
function aaa(){
var a; //聲明提前了
alert(a);
a=20; //賦值扔留着原地
}
aaa();
4.當參數跟局部變量重名的時候,優先級是等同的
var a=10; function aaa(a){ alert(a); var a=20; //因為 a 是形參,優先級高於 var a; 所以 局部變量a的聲明其實被忽略了。 } aaa(a); //結果為:10
5.變量修改的時候另一個變量會跟着變化,但是當變量重新被定義時,則另一個不變化
var a=[1,2,3]; var b=a; b.push(4); alert(a);//結果為[1,2,3,4] 當b改變的時候a也發生了改變
當b重新被賦值的時候 a不會改變.示例:
var a=[1,2,3]; var b=a;
b=[1,2,3,4]
alert(a)//結果為[1,2,3]
