由作用域链引发的一个小问题

在写上一篇博文的过程中发现了一个小问题,

var a=2;
function f(){
    var b=a;
    f2=function(y){
        return y;
    }
}

f();
console.log(f2(b));//not defined 而不是 2

由于f2是闭包,能访问f2作用域链中的变量b,最开始我以为结果会输出2,但结果被打脸。

原因是我弄混了作用域链和函数之间的关系。要理解作用域链,最重要的是下面这句话:

每一段js代码(全局代码或函数)都有一个与之关联的作用域链。

也就是说,作用域链是与代码相关联的,f2(b)是全局代码而不是f2()的代码,因此在执行时所关联的作用域链是全局对象,并不能访问f的活动对象,因此输出b为not defined。

猜你喜欢

转载自blog.csdn.net/u012075670/article/details/55664484