美文网首页
2021-08-27

2021-08-27

作者: 隔壁老王z | 来源:发表于2021-08-29 11:04 被阅读0次
    // 写法1
    function foo() {
        var a = 1
        function bar() {
            debugger
            console.log(a)
        }
        return bar
    }
    var func = foo()
    func()
    
    // 写法2
    function foo() {
        var a = 1
        function bar() {
            debugger
            console.log(a)
        }
        bar()
    }
    foo()
    
    // 写法3
    function foo() {
        var a = 1
        bar()
    }
    function bar() {
        debugger
        console.log(a)
    }
    foo()
    
    写法1作用域和调用栈 写法2作用域,调用栈和1不一样 写法3作用域找不到a变量,会报错
    1、可以看到1和2写法都会存在闭包
    2、2和3的写法只是bar函数定义的位置不一样,为什么3会报错2不会呢?
    实际上是因为JS代码在执行之前会有预编译阶段,在预编译函数时会创建AO活动对象(实际就是说明在函数体内哪些变量&函数可用,如:AO = { this, argunments, b: function () {}, c: undefined })
    预编译阶段发生变量声明和函数声明,没有初始化行为(赋值),匿名函数不参与预编译 ; 只有在解释执行阶段才会进行变量初始化 ;

    在3中,预编译阶段AO中是没有发现变量a的,所以执行的时候会报错。

    相关文章

      网友评论

          本文标题:2021-08-27

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