JS作用域问题4,示例1和2的输出疑问

JS作用域问题4,示例1和2的输出疑问

http://img1.sycdn.imooc.com//climg/5d850b86099c4f2a05200420.jpg

http://img1.sycdn.imooc.com//climg/5d850b86094101dc04920418.jpg

第一个的fn()输出为什么是undefined,第二个fn()的输出却是1?

第一个的例子中,预解析时a=undefined,但是执行时不是和示例2中一样,

都是先执行了一下var a = 1;

fn()的输出应该都是1,不是吗?

这个点是不是没有讲出来?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
好帮手慕慕子 2019-09-23 15:31:09

同学你好, 因为第一种写法,fn函数内部的a使用var声明的,函数作用域中存在同名的变量,所以解析fn内部的a为undefined, 执行fn的时候, 先打印a的值为undefined, 然后执行var a = 2. 此时是在函数内部, 不会修改全局作用域中的a, 所以最终打印的结果还是1.

如果帮助到了你, 欢迎采纳!

祝学习愉快~~~~

  • 提问者 张乔升 #1
    感谢回答。跟您请教一下:第一种情况,预解析的时候不应该是整体跳过function的吗?这里第一种情况fn()输出undefined的原因不应该是——因为局部作用域(函数内部)有同名变量a,所以不会向外查找。而此时预解析得到的a=undefined。。。。。。。。。。。。。。。。。。不应该是这样的逻辑吗?
    2019-09-25 20:29:27
  • 好帮手慕慕子 回复 提问者 张乔升 #2
    同学你好, 你理解的逻辑是正确的, 祝学习愉快~~~
    2019-09-26 09:34:47
好帮手慕慕子 2019-09-23 11:11:05

同学你好, “qq_愿_26”解析的很详细,同学可以参考理解

现在来分析同学不明白的, 为什么a从undefined变成1了。

因为预解析的时候, fn内部的a没有使用var声明, 所以在预解析的过程中a是undefined, 然后在执行阶段, 先执行var a =1, 此时a的值由undefined变为1, 所以调用fn的时候, 打印出来的a值为1。

如果帮助到了你, 欢迎采纳!

祝学习愉快~~~~


  • 提问者 张乔升 #1
    感谢回答。但依然不理解的还是第一个fn( )为什么输出是undefined。按照这个道理,应该也是1,而不应该是undefined才对。
    2019-09-23 15:02:44
qq_愿_26 2019-09-22 19:43:42

函数预解析过程

① 创建一个AO对象(activation object)
② 找形参和变量声明的名 ,作为AO对象的属性名(初始都为undefined)
③ 将实参的值与形参的值相统一
④ 找函数声明,并把属性值写全。如果有与②中重复的属性名,则不写属性名,直接覆盖②的属性值。

你可以按照上面预解析的步骤来理解,首先是预解析阶段:

var a = 1;  function fn(){console.log(a); var a = 2;}  fn(); console.log(a);

从步骤2可以看出来,在预解析的时候,a = underfind; 然后在fn()预解析的时候 a = underfind,所以console.log(a)的值是underfind。当fn预解析完了之后,a 由underfind变成了1,所以第二个console.log(a)的值是1;

var a =1; function fn(){console.log(a);a=2;} fn();console.log(a);

在预解析的时候, a = underfind;然后在fn()预解析的时候,没有搜索到以var开头的声明,所以fn()就没有预解析了,然后在看a由underfind变成了1,所以fn()执行的时候,console.log(a)的值就是1了,由于fn中 a = 2 是个全局变量,所以a由1变成了2,所以 console.log(a)的值就变成了2了

  • 提问者 张乔升 #1
    您好,非常感谢您这么用心和辛苦的回答。 我这里还想向您请教一下: 您最后一段话说的“所以fn()就没有预解析了,然后在看a由underfind变成了1,” 这里为什么a从undefined 变成1了?
    2019-09-22 19:54:35
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师