var i=10;
function a() {
alert(i);
var i = 2;
alert(i);
};
a();
挺经典的一道题,结果出得让人不得不觉得奇怪,想知道是虾米回事,内部到底是怎么执行的。
先看JS的执行行顺序
如果一个文档流中包含多个script代码段(用script标签分隔的js代码或引入的js文件),它们的运行顺序是:
- 步骤1. 读入第一个代码段(js执行引擎并非一行一行地执行程序,而是一段一段地分析执行的)
- 步骤2. 做语法分析,有错则报语法错误(比如括号不匹配等),并跳转到步骤5
- 步骤3. 对var变量和function定义做“预解析”(永远不会报错的,因为只解析正确的声明)
- 步骤4. 执行代码段,有错则报错(比如变量未定义)
- 步骤5. 如果还有下一个代码段,则读入下一个代码段,重复步骤2
- 步骤6. 结束
原来JS在执行过程之前,会对【var】和【function】定义做“预解析”。
解析引擎以块为单位级别,执行所有Var变量的创建,并赋予一个初始值undefined。这样子就能理解了为什么弹出undefined 2这样的答案而不是10 2。
有3 位同学留下了脚印
你将var i = 2;分解为var i;i = 2;问题迎刃而解。
高手!这种理解方法确实比较好
正解,顺便消灭零回复