1.如下代码的输出?为什么?
var a = 1
function fn1(){
function fn2(){
console.log(a)
}
function fn3(){
var a = 4
fn2()
}
var a = 2
return fn3
}
var fn = fn1()
fn() //输出多少
2
//声明提前,代码变成:
var a = 1
var fn
function fn1(){
function fn2(){
console.log(a)
}
var a
function fn3(){
var a = 4
fn2()
}
a = 2
return fn3
}
fn = fn1()
fn()
原因:
1.函数在执行过程中,会在内部寻找变量
2.如果找不到,再从“创建当前函数的作用域”中去找,以此往上
3.fn2上层作用域是fn1,a = 2
2.如下代码的输出?为什么?
var a = 1
function fn1(){
function fn3(){
var a = 4
fn2()
}
var a = 2
return fn3
}
function fn2(){
console.log(a)
}
var fn = fn1()
fn() //输出多少
1
//声明提升后,代码变成:
var a = 1
var fn
function fn1(){
var a
function fn3(){
var a = 4
fn2()
}
a = 2
return fn3
}
function fn2(){
console.log(a)
}
fn = fn1()
fn()
原因:
1.函数执行过程中,会从内部找变量
2.如果找不到,再从“创建函数的作用域”里面去找
3.fn2的上层作用域是全局作用域,全局作用域中 a = 1
3.如下代码的输出?为什么?
var a = 1
function fn1(){
function fn3(){
function fn2(){
console.log(a)
}
fn2()
var a = 4
}
var a = 2
return fn3
}
var fn = fn1()
fn() //输出多少
undefined
声明提升后,代码变成:
var a = 1
var fn
function fn1(){
var a
function fn3(){
function fn2(){
console.log(a)
}
var a
fn2()
a = 4
}
a = 2
return fn3
}
fn = fn1()
fn()
原因:
a在函数执行时没有赋值,所以为undefined
总结:
1.函数在执行的过程中,先从自己内部找变量
2.如果找不到,再从创建当前函数所在的作用域去找, 以此往上
3.注意找的是变量的当前的状态