搜索

关于JS预解析一道题

1009

var i=10;
function a() {
    alert(i);
    var i = 2;
    alert(i);
};
a();

挺经典的一道题,结果出得让人不得不觉得奇怪,想知道是虾米回事,内部到底是怎么执行的。

先看JS的执行行顺序

如果一个文档流中包含多个script代码段(用script标签分隔的js代码或引入的js文件),它们的运行顺序是:

  1. 步骤1. 读入第一个代码段(js执行引擎并非一行一行地执行程序,而是一段一段地分析执行的)
  2. 步骤2. 做语法分析,有错则报语法错误(比如括号不匹配等),并跳转到步骤5
  3. 步骤3. 对var变量和function定义做“预解析”(永远不会报错的,因为只解析正确的声明)
  4. 步骤4. 执行代码段,有错则报错(比如变量未定义)
  5. 步骤5. 如果还有下一个代码段,则读入下一个代码段,重复步骤2
  6. 步骤6. 结束

原来JS在执行过程之前,会对【var】和【function】定义做“预解析”。

解析引擎以块为单位级别,执行所有Var变量的创建,并赋予一个初始值undefined。这样子就能理解了为什么弹出undefined 2这样的答案而不是10 2。

3 位同学留下了脚印

  1. 苏昊 2011-10-17

    你将var i = 2;分解为var i;i = 2;问题迎刃而解。

    回复
    • gf 2011-10-30

      高手!这种理解方法确实比较好

      回复
  2. hpf1908 2011-10-09

    正解,顺便消灭零回复

    回复

同学有话要说吗?