老师既然预解析声明了if里面的函数,那么前面两个为什么打印不出来。

老师既然预解析声明了if里面的函数,那么前面两个为什么打印不出来。

console.log(fn);

console.log(add);

if (true) {

    function fn(){

        return  console.log('jfosjdfo')

    }

}else{

      function add(){

        return console.log('nihao ')

    }

}

console.log(fn);


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

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

3回答
好帮手慕言 2020-03-22 10:53:03

同学你好,理解的是正确的,很棒,继续加油,祝学习愉快~

好帮手慕夭夭 2020-03-21 19:56:45

同学你好,确实如你所说,在前面调用没有报错,也进行预解析了。这里老师说的是有问题的,很抱歉,老师重新跟你解释一下:

(讲解的知识涉及es6,最后一个阶段才会学到,暂时对以下内容了解一下即可,等学习了es6再来复习)

课程中老师讲的是对的,视频中强调了一下在没有块级作用域的时候,if判断中的函数会在全局预解析。因为大部分高版本浏览器已经开始支持es6语法规则了,所以这里的if判断按照会当成块级作用域,在es6语法中,如果在块级作用域中声明的函数,会有以下情况:

  1. 函数声明类似于var,即会提升到全局作用域或函数作用域的头部。所以这里声明的两个函数,在全局下会预解析,只不过与声明变量类似,相当于声明了变量没有赋值,所以输出为undefined。

  2. 同时,函数声明还会提升到所在的块级作用域的最前,所以在if中是可以输出函数的。

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

另外,同学可以使用低版本ie测试一下,是可以输出两个函数的。因为低版本不兼容es6,所以就像课程中老师说的,在没有块级作用域时,if中的两个函数在全局下预解析。

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

  • 提问者 慕用6004130 #1
    好的,老师变量提升和函数提升其实也就是预解析吧?
    2020-03-21 21:18:13
好帮手慕夭夭 2020-03-21 16:06:40

同学你好,视频中老师描述的有一些问题,老师会把视频的问题上报。正确的是,需要执行if或者else ,里面的函数才会预解析,如下在if中:

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

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

  • 提问者 慕用6004130 #1
    我把if语句删了之后就会报错,如果是在执行之后才会预解析,那么我不需要删除if语句他也会报错的呀,这说明是不是还是跟window一起预解析的呢,变成了undefined
    2020-03-21 16:14:53
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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