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

函数作用域中定义在后面的变量能被前面的表达式访问到吗?

函数作用域中定义在后面的变量能被前面的表达式访问到吗?

holdtom 2019-04-19 16:12:46
functiontest(){alert(a);vara=10;}test();运行结果是Undefined。这与书上写的“函数中的任何位置定义的变量在该函数中的任何地方都可见(《javascript语言精粹》第36页)”似乎是矛盾的。想请教各位,我可能在什么地方理解有误。
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

不矛盾的,JavaScript会加载或者说是解析两次
第一次:解析加载变量声明,函数声明,对函数的参数赋值
第二次:给变量赋值,执行函数
因为js是顺序加载,即从上到下,所以在函数中,的加载顺序是这样的:
//无变量声明1
functiontest(){
//参数赋值2.1无参数,所以无参数赋值
vara;//声明变量2.2变量声明总会优先于变量赋值,所以就有“变量提示”这一说
//无函数声明2.3
alert(a);//执行函数2.4a因为没有赋值,所以是undefined
a=10;//赋值变量2.5a现在被赋值了a=10
}
test();//2这里挺关键的分解看是声明函数表达式+执行函数==>test+()
//在声明的时候会跳到函数表达式声明的地方
总结:
不要在变量赋值之前使用,除非你想用其默认值
函数声明在哪里(执行位置的前后)都可以
                            
查看完整回答
反对 回复 2019-04-19
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

变量提升(hoist),这段代码相当于:
functiontest(){
vara;
alert(a);//undefined
a=10;
}
                            
查看完整回答
反对 回复 2019-04-19
  • 2 回答
  • 0 关注
  • 415 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信