varfn1=function(){vara=1alert(a)fn2=function(){console.log(a);}}fn1();fn2();这样的话全局的fn2,读取用到了局部函数fn1的vara=1?不符合作用域链啊?
2 回答

ITMISS
TA贡献1871条经验 获得超8个赞
函数fn2就被包括在函数fn1内部,这时fn1内部的所有局部变量,对fn2都是可见的,但是对于fn2来说是改变不了fn1任何局部变量的值的。同时fn2内部的局部变量,对fn1是不可见的。这就是Javascript语言特有的“链式作用域”结构(chainscope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。varfn2;//此时fn2为undefinedvarfn1=function(){vara=1//alert(a)//重新定义fn2为一个函数,因此可以在外部调用fn2fn2=function(){a=4;console.log('fn2',a);fn1();}console.log('fn1',a);}fn1();fn2();

largeQ
TA贡献2039条经验 获得超7个赞
这个其实相当于是闭包,fn2可以理解为全局的变量被赋为一个函数,其实可以这么理解://这里有一个fn2,被赋值为`function(){console.log(a)}`varfn1=function(){vara=1alert(a)fn2=function(){console.log(a);}}fn1();fn2();而JavaScript是静态作用域,也就是作用域是在定义的时候就确定了的。所以是符合作用域链的。
添加回答
举报
0/150
提交
取消