// 写法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的,所以执行的时候会报错。
网友评论