Javascript 会在预编译期对变量进行赋值吗?

2017-09-11 22:38:20 +08:00
 jmyz0455

先看这段 代码,打开 console,你会看到一共输出两次,一次是 thead 未声明的时候,会输出 undefined,这里没有一点问题,但是接下来的输出,是紧接声明语句的:

thead = document.createElement('tr');
console.info(thead);

这时候变量 thead 仅仅是声明了,不应该有值,但是第二次的输出,居然出现了该函数运行结束时,变量 thead 应该获得的所有值,请问这是为什么呢,Javascript 难道在预编译期对变量进行初始化?可这是获得了该函数最后得出的值啊,想不明白,求解,希望大家也用 代码 给我演示一下。

1448 次点击
所在节点    JavaScript
3 条回复
SilentDepth
2017-09-12 00:19:54 +08:00
楼主似乎没有把问题说明白。如果我理解的没错的话,楼主是想问:为什么第二个 console.log 紧跟在 thead 赋值之后,理应输出一个空的 <tr>(吐槽:为什么生成的是 <tr>,变量名却写的是 thead ),而实际上连再之后 appendChild 的几个 <th> 也打印出来了。

从 JS 执行的角度来说,第二个 console.log 确实应该输出 <tr> 本身。但我们看的并不是 JS 真正的执行结果,而是 Console 这个东西的显示结果。楼主可以看一下这个回答: https://stackoverflow.com/a/23392650

简单来说,console 并不存在于 JS 规范中,它是 JS 运行环境(比如浏览器)定义的东西。出于性能上的考虑,它可能不会与 JS 代码「严格同步」地工作(至少不会同步地渲染)。楼主提到的情况,是 Console 在打印 thead 的值时 JS 程序已经执行到了 function 末尾,由于 thead 在这里是一个引用,于是其子节点也一并被输出出来来了。如果你尝试在 for 循环开始之前打一个断点,可以看到输出的只是一个空的 <tr>。
autoxbc
2017-09-12 02:44:53 +08:00
转换为基本类型,使其静态化再输出
console.info(thead.outerHTML)
jmyz0455
2017-09-12 10:00:10 +08:00
@SilentDepth 非常感谢,我的确没有把问题说清楚,我以后会注意说明输出代码的期望值和实际值的。你的理解也没错,我就是这个意思。那个变量名其实是因为,这是我在别的代码块里发现了这个问题,然后我把这一块迁出来 jsfiddle 忘了改变量名:)

现在搞明白了谢谢。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/389904

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX