函数 进阶学习之三 一个简单而又复杂的问题
//题目一: var a = 1; function foo() { alert(a); }; foo(); //题目二: var a = 1; function foo() { if (!a) { var a = 2; } alert(a); }; foo(); //题目答案:第一个弹出1 第二个弹出2 /* *对于第二个;按照一般的思路: *1.创建了全局变量 a,定义其值为 1 *2.创建了函数 foo *3.在 foo 的函数体内,if 语句将不会执行,因为 !a 会将变量 a 转变成布尔的假值,也就是 false *4.跳过条件分支,alert 变量 a,最终的结果应该是输出 1 */ //看起来无懈可击的推理啊,但让人惊讶的是:答案竟然是 2!
问题分析
首先我要告诉你这不是什么错误,而是 JavaScript 语言解释器的一个(非官方的)特性,某人把这个特性叫做:Hoisting(目前尚未有标准的翻译,比较常见的是提升)。
发现此处有一个变量声明和赋值,于是解析器会将其声明提升至当前作用域的顶部(这是默认行为,并且无法更改),这个行为就叫做 Hoisting。
链接:理解Hoisting 以及 为什么是 2的问题http://www.jb51.net/article/75090.htm