没写var的情况下, fn2相当于全局函数,但是可以读取局部变量?

var fn1 = function(){

var a=1
alert(a)
fn2=function(){

  console.log(a);

}
}
fn1();
fn2();
这样的话全局的fn2,读取用到了局部函数fn1的var a=1?不符合作用域链啊?

阅读 2.4k
2 个回答

函数fn2就被包括在函数fn1内部,这时fn1内部的所有局部变量,对fn2都是可见的,但是对于fn2来说是改变不了fn1任何局部变量的值的。
同时fn2内部的局部变量,对fn1是不可见的。这就是Javascript语言特有的“链式作用域”结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。
所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

var fn2; // 此时fn2为undefined

var fn1 = function () {

        var a = 1
        // alert(a)
        // 重新定义fn2为一个函数,因此可以在外部调用fn2
        fn2 = function () {
            a = 4;
            console.log('fn2',a);
            fn1();
        }

        console.log('fn1',a);
    }

    fn1();
    fn2();

这个其实相当于是闭包,fn2可以理解为全局的变量被赋为一个函数,其实可以这么理解:

// 这里有一个fn2,被赋值为`function() {console.log(a)}`

var fn1 = function(){

    var a=1
    alert(a)
    fn2=function(){
    
        console.log(a);
    }
}
fn1();
fn2(); 

而JavaScript是静态作用域,也就是作用域是在定义的时候就确定了的。

所以是符合作用域链的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题