js中的作用域链

1、JavaScript的全局变量和局部变量

首先,先来看看js的全局变量和局部变量,js不是块级作用域,所以不能把你学过的C/C++作用域的知识用在js中!

(1)全局变量

    var x = 1;
    alert(window.x);//弹出1

js的全局变量也可以看做window对象的属性,这句话怎么理解,请看以下代码:

    function fn(){
        x = 1;
    }
    fn();
    alert(window.x);

结果是什么呢?还是1
这是因为,如果在函数中没有用关键字var定义变量,那么函数中的变量就会变成全局变量。所以结果会是1.

(2)局部变量

在javascript中就只有函数块,函数中定义的变量就是局部变量,但是必须有关键字var!(没有关键字var定义的都是全局变量)。
其他的地方都不是局部变量,比如说if else语句和for循环中创建的变量在外部都可以访问的到

    function fn(){
        var x = 1;
    }
    for(var i = 0;i<5;i++){
     
    }
    if(i){
        var a = 5;
    }
    fn();
    alert(i);
    alert(a);
    alert(x);//error x is not defined

2、作用域链

什么是作用域链? 每一个函数都有一个作用域, 如果一个函数内部又嵌套链另外一个函数,嵌套的函数也会又一个作用域,这样,嵌套函数就能访问到外部函数中的变量,以及全局作用域中的变量,此时就形成了一条作用域链。

    var x = 1;
    function fn(){
        var y = 2;
     
        function bar(){
            var z = 3;
            alert(x+y+z);
        }
        bar();
    }
    fn();

以上代码运行过程中,在bar函数中没有y和z,执行x+y+z时,javascript搜索x,y,z变量的一种机制就是作用域链,这个例子的搜索顺序:bar->foo->window,即bar函数在执行的过程中,先从自己内部找变量,如果找不到,再从创建当前函数所在的作用域(在fn函数的作用域中找到y,在全局变量中找到x)去找, 以此往上,

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容