V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
jmyz0455
V2EX  ›  JavaScript

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

  •  
  •   jmyz0455 · 2017-09-11 22:38:20 +08:00 · 1435 次点击
    这是一个创建于 2390 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    SilentDepth
        1
    SilentDepth  
       2017-09-12 00:19:54 +08:00   ❤️ 2
    楼主似乎没有把问题说明白。如果我理解的没错的话,楼主是想问:为什么第二个 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
        2
    autoxbc  
       2017-09-12 02:44:53 +08:00
    转换为基本类型,使其静态化再输出
    console.info(thead.outerHTML)
    jmyz0455
        3
    jmyz0455  
    OP
       2017-09-12 10:00:10 +08:00
    @SilentDepth 非常感谢,我的确没有把问题说清楚,我以后会注意说明输出代码的期望值和实际值的。你的理解也没错,我就是这个意思。那个变量名其实是因为,这是我在别的代码块里发现了这个问题,然后我把这一块迁出来 jsfiddle 忘了改变量名:)

    现在搞明白了谢谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3328 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 10:45 · PVG 18:45 · LAX 03:45 · JFK 06:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.