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 定義變量時,會默認為是全局變量(不規范,不推薦)

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]
 
        

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM