2021-08-27

2021-08-29  本文已影响0人  隔壁老王z
// 写法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的,所以执行的时候会报错。

上一篇 下一篇

猜你喜欢

热点阅读