美文网首页
12.JavaScript作用域&作用域链

12.JavaScript作用域&作用域链

作者: 讲武德的年轻人 | 来源:发表于2019-08-09 16:21 被阅读0次

    JS中只有函数级别的作用域,没有块级别的作用域;换句话说,只有在进入或者退出函数的时候,作用域会发生变化。

    函数的作用域:外部对内部可见;内部对外部不可见;内部优先;

    一. 外部对内部可见

    且看以下代码,浏览器会输出什么呢?

    var scope = 'g';
    function t(){
        console.log(scope);
        var scope = 'l';
        console.log(scope);
    }
    t();
    

    结合预编译的知识可以知道,浏览器依次输出“undefined”、“l”,前面输出undefined主要是因为在函数内部对scope这个变量有定义,但是若函数里面不存在这条定义,会怎么输出呢?

    var scope = 'g';
    function t(){
        console.log(scope);
        console.log(scope);
    }
    t();
    

    这样的话,输出都为“g”

    二. 内部对外部不可见

    且看以下代码,浏览器会报错:

    function t(){
        var scope = 'l';
    }
    t();
    console.log(scope)
    
    三. 都可见时,内部优先
    var scope = 'g';
    function t(){
        console.log(scope);
        var scope = 'l';
        console.log(scope);
    }
    t();
    

    该段代码与第一段重复,但同样可以说明问题。

    执行环境(execution context),定义了执行期间可以访问的变量和函数。

    1. 全局执行环境
    • Global Object(window)
    • 从见到JS代码开始创建
    • 到网页关闭时销毁
    1. 函数执行环境
    • Activation Object
    • 从函数调用开始创建
    • 到函数调用结束时销毁

    作用域链

    • 作用域[[scope]]和作用域链,每个函数都有。
    • 作用域是私有属性,只能由JS引擎访问
    • 作用域链,是AO和GO构成的链
    • 所谓执行环境,就是根据作用域链依次查找变量和函数:找到即停,全部找完无果,报错。

    相关文章

      网友评论

          本文标题:12.JavaScript作用域&作用域链

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