js的作用域、作用域链

253 阅读1分钟

作用域

所谓作用域,就是变量或者是函数能作用的范围。

那么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