关于预解析机制

关于预解析机制

# 具体遇到的问题
老师,下面的代码中报错为 analysis is not a function,按照我的理解是这样的:首先预解析发现有function声明和var,先把全局变量analysis赋值为undefined,接着把函数体内的age赋值为undefined。预解析完成。开始从上到下执行代码,最后一条打印在控制台不应该是调用函数吗?返回结果应该是undefined,因为没有在函数体内console,也没有把结果return出来,为什么会报错呢?函数的声明也早于变量,如果是变量在前,执行代码时会把analysis赋值为12345,这时调用函数analysis才会报错。
# 报错信息的截图

# 相关课程内容截图

# 尝试过的解决思路和结果

# 粘贴全部相关代码,切记添加代码注释(请勿截图)

function analysis() {
            var age=18;
        }

        var analysis=12345;
        console.log(analysis());



正在回答

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

1回答

同学你好,理解的不对。页面打开时,先是全局变量和全局函数预解析。而函数中的变量属于局部变量,在函数调用之后才会预解析。问题中的代码,预解析与执行过程参考如下:

1. 页面打开时,开始预解析通过function声明的函数analysis和通过var声明的变量analysis。注意函数的预解析优先级是比较大的,也就是说同名的函数与变量预解析时,最终保留的是函数。所以预解析结束,analysis是一个函数。

你可以理解成如下:

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

2.预解析结束,开始执行代码。先为函数analysis重新赋值(变量的赋值不会预解析,这里注意一下),赋值之后,analysis就不是函数了,而是一个数字。最后调用数字analysis报错,因为它不是一个函数,不能使用函数调用的语法了。

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

3.如果想要成功调用函数,可以把赋值去掉,这样执行阶段,函数就不会重新赋值了。如下:

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

以上analysis函数没有赋值为数字,所以可以成功调用。调用时,会先对函数中声明的变量进行预解析,预解析结束之后,再执行函数中的代码哦。

祝学习愉快~


问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星

相似问题

登录后可查看更多问答,登录/注册

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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