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

js的作用域

js的作用域

富国沪深 2019-04-21 20:38:00
vara=1;functionb(){a=10;return;functiona(){}}b();console.log(a);控制台打出来是1,在b函数中不是有a=10吗,这样声明是一个全局变量吧,,为什么打印的是1,是不是在全局这个范围找到的a的声明就不会去函数里找a的声明啦??求解。。谢谢大家
查看完整描述

2 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

JavaScript解释器中存在一种变量声明被提升(hoisting)的机制,也就是说变量
(函数)的声明会被提升到作用域的最前面,即使写代码的时候是写在最后面,也还是
会被提升至最前面。
例如以下代码段:
alert(foo);//functionfoo(){}
alert(bar);//undefined
functionfoo(){}
varbar=functionbar_fn(){};
alert(foo);//functionfoo(){}
alert(bar);//functionbar_fn(){}
输出结果分别是functionfoo(){}、undefined、functionfoo(){}和function
bar_fn(){}。
可以看到foo的声明是写在alert之后,仍然可以被正确调用,因为JavaScript解释
器会将其提升到alert前面,而以函数表达式创建的函数bar则不享受此待遇。
那么bar究竟有没有被提升呢,其实用var声明的变量都会被提升,只不过是被先赋值
为undefined罢了,所以第二个alert弹出了undefined。
所以,JavaScript引擎执行以上代码的顺序可能是这样的:
创建变量foo和bar,并将它们都赋值为undefined。
创建函数foo的函数体,并将其赋值给变量foo。
执行前面的两个alert。
创建函数bar_fn,并将其赋值给bar。
执行后面的两个alert。
注:
严格地说,再JavaScript中创建函数的话,还有另外一种方法,称为“函数构造法”:
varfoo=Function('alert("hi!");');
varfoo=newFunction('alert("hi!");');//等同于上面一行
此方法以一个字符串作为参数形成函数体。但是用这种方法,执行效率方面会打折扣,
且似乎无法传递参数,所以少用为妙。
                            
查看完整回答
反对 回复 2019-04-21
  • 2 回答
  • 0 关注
  • 243 浏览
慕课专栏
更多

添加回答

举报

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