关于预解析机制
# 具体遇到的问题
老师,下面的代码中报错为 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. 页面打开时,开始预解析通过function声明的函数analysis和通过var声明的变量analysis。注意函数的预解析优先级是比较大的,也就是说同名的函数与变量预解析时,最终保留的是函数。所以预解析结束,analysis是一个函数。
你可以理解成如下:
2.预解析结束,开始执行代码。先为函数analysis重新赋值(变量的赋值不会预解析,这里注意一下),赋值之后,analysis就不是函数了,而是一个数字。最后调用数字analysis报错,因为它不是一个函数,不能使用函数调用的语法了。
3.如果想要成功调用函数,可以把赋值去掉,这样执行阶段,函数就不会重新赋值了。如下:
以上analysis函数没有赋值为数字,所以可以成功调用。调用时,会先对函数中声明的变量进行预解析,预解析结束之后,再执行函数中的代码哦。
祝学习愉快~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星