js的作用域、作用域鏈

Zenquan發表於2018-04-27

作用域

所謂作用域,就是變數或者是函式能作用的範圍。

那麼JavaScript裡有什麼作用域呢? 1、全域性作用域

除了函式中定義的變數之外,都是全域性作用域。

舉個栗子:

var a = 10;
function bar(){
    console.log(a);
}
bar();//10
複製程式碼

以上的a就是全域性變數,到處可以訪問a。 然鵝,

var a = 10;
function bar(){
    console.log(a);
    var a = 20;
}
bar();//undefined
複製程式碼

什麼鬼?undefined? 是的,你沒看錯。因為先搜尋函式的變數看是否存在a,存在,又由於a被預解析(變數提升),提升的a繫結了這裡的a作用域,所以結果就是undefined。 2、區域性作用域

函式裡用var宣告的變數。

舉個栗子:

var a = 10;
function bar(){
   var a  = 20;
    console.log(a);
}
bar();//20
複製程式碼

3、沒有塊級作用域(至ES5),ES6中有塊級作用域

ES6之前,除了函式之外的塊都不具備塊級作用域。

常見的經典例子:

for(var i=0;i<4;i++){
    setTimeout(function(){
    	console.log(i);
    },200);
}
//4 4 4 4
複製程式碼

解決辦法:

for(var i=0;i<4;i++){
    (function(j){
            setTimeout(function(){
    	console.log(j);
    },200);
    })(i)
}
//0 1 2 3
複製程式碼

作用域鏈

變數隨著作用長輩函式一級一級往上搜尋,直到找到為止,找不到就報錯,這個過程就是作用域鏈起的作用。

var num = 30;
function f1(){
    var num  = 20;
    function f2(){
        var num = 10;
        function f3(){
            var num = 5;
            console.log(num);
        }
        f3();
    }
   f2();
}
f1();
複製程式碼

js

相關文章