美文网首页
JS作用域链

JS作用域链

作者: leo_luo | 来源:发表于2019-02-20 01:16 被阅读0次

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

    (1) 全局变量

    js的全局变量也可以看做window对象的属性。
      如果在函数中定义变量时没有用关键字var,那么实际上定义的就是全局变量。

    (2)局部变量

    要说块级作用域,那么在js中就只有函数块,函数中定义的变量就是局部变量,当然必须有关键字var!(没有关键字var定义的都是全局变量)

    也就是说if else语句和for循环中创建的变量在外部都可以访问的到

    <pre>function foo(){ var x = 1;
    } for(var i = 0;i<10;i++){
    
    } if(i){ var y = 10;
    }
    foo();
    alert(i);//10
    alert(y);//10
    alert(x);//error x is not defined</pre>
    

    2、作用域链

    <pre>var x = 1; function foo(){ var y = 2; function bar(){ var z = 3;
            alert(x+y+z);
        }
        bar();
    }
    foo();</pre>
    

    在bar函数中没有y和z,执行x+y+z时,js搜索x,y,z变量的一种机制就是作用域链,这个例子的搜索顺序:bar->foo->window

    bar的作用域链是:

    <pre>**barScopeChain = [
        bar.AO,
        foo.AO,
        global.VO
    ];**</pre>
    

    foo的作用域链是:

    <pre>fooScopeChain = [
        foo.AO,
        global.VO
    ];</pre>
    

    在函数执行过程中,每遇到一个变量,都会检索从哪里获取和存储数据,该过程从作用域链头部,也就是从活动对象开始搜索,查找同名的标识符,如果找到了就使用这个标识符对应的变量,如果没有则继续搜索作用域链中的下一个对象,如果搜索完所有对象都未找到,则认为该标识符未定义,函数执行过程中,每个标识符都要经历这样的搜索过程。

    相关文章

      网友评论

          本文标题:JS作用域链

          本文链接:https://www.haomeiwen.com/subject/tqzqyqtx.html