美文网首页
我理解的作用域

我理解的作用域

作者: wade3po | 来源:发表于2019-02-02 15:44 被阅读0次

    JavaScript开发中,作用域算是难点和一大核心,作用域的理解很深,我可能会另外再写一些,先写一下目前为止理解到的层次。

    JavaScript中,是没有块级作用域的,你在if或者for里面声明了一个变量,在外面还是能使用。

    for(var i = 0;i < 1;i++){
        var a = 1;
    }
    if(9){
        var b = 2;
    }
    console.log(a);//输出1
    console.log(b);//输出2
    

    JavaScript中采用函数作用域,每个函数都算是自己的一个作用域。

    function fun() {
        var a = 1;
    }
    fun();
    console.log(a);//报错Uncaught ReferenceError: a is not defined。
    
    

    函数有一个作用域链,执行的时候从内向外层层寻找。

    function fun1() {
        var a = 1;
        function fun2() {
           var a = 2;
           function fun3() {
               var a = 3;
               console.log(a);
           }
           fun3();
        }
        fun2();
    }
    fun1();
    

    输出3,如果fun3里面没有定义a,那么向外寻找输出2,如果fun2里面没有定义a,继续向外寻找输出1,要是还没有,那么久报错undefined。

    在执行方法前,作用域链是早就创建的。

    function fun1() {
        var a = 1;
        function fun2() {
           console.log(a);
        }
        a = 3;
        return fun2;
    }
    fun1()();
    

    如果没有a = 3,那么输出的就是1,因为有了a = 3,那么输出就是3,因为在执行方法之前,整个作用域链是已经创建完毕的。上面执行其实等价于

    function fun1() {
        var a = 1;
        function fun2() {
           console.log(a);
        }
        a = 3;
        return fun2;
    }
    var fun = fun1();
    fun();
    

    执行fun = fun1();的时候,a已经为1替换成3了,再执行fun();就输出了3。

    JavaScript中,函数声明是提前的,会移到顶部。

    function fun() {
        console.log(a);
    }
    fun();
    

    会报错Uncaught ReferenceError: a is not defined。

    function fun() {
        console.log(a);
        var a = 3;
    }
    fun();
    

    会输出undefined,而不是报错,我们都知道,输出undefined是没有赋值,所以可以表明a的声明已经移到了顶部,但是赋值的操作却是留在了原地,所以输出undefined不报错。

    欢迎关注 Coding 个人笔记 公众号

    相关文章

      网友评论

          本文标题:我理解的作用域

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