为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

鸿蒙传说 2019-05-24 11:04:23
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为undefined
varfn1=function(){
vara=1
//alert(a)
//重新定义fn2为一个函数,因此可以在外部调用fn2
fn2=function(){
a=4;
console.log('fn2',a);
fn1();
}
console.log('fn1',a);
}
fn1();
fn2();
                            
查看完整回答
反对 回复 2019-05-24
?
largeQ

TA贡献2039条经验 获得超7个赞

这个其实相当于是闭包,fn2可以理解为全局的变量被赋为一个函数,其实可以这么理解:
//这里有一个fn2,被赋值为`function(){console.log(a)}`
varfn1=function(){
vara=1
alert(a)
fn2=function(){
console.log(a);
}
}
fn1();
fn2();
而JavaScript是静态作用域,也就是作用域是在定义的时候就确定了的。
所以是符合作用域链的。
                            
查看完整回答
反对 回复 2019-05-24
  • 2 回答
  • 0 关注
  • 379 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号