关于javaScript作用域链

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.注意找的是变量的当前的状态

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。