JS做用域面試題總結

關於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]
相關文章
相關標籤/搜索