關於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 定義變量時,會默認爲是全局變量(不規範,不推薦)dom
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;spa
function aaa(){ var a=b=10; }
aaa();
alert(a);//結果爲,沒法訪問到
alert(b);//結果爲10;
3.變量的查找是就近原則去尋找,定義的var變量;第二點,變量的聲明被提早到做用域頂部,賦值保留在原地,以下dome;code
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]