这个照样本身记一下,在以下这篇文章中也有很好的解说
http://www.kenneth-truyers.net/2013/04/20/javascript-hoisting-explained/
Javascript中没有block scope,只要函数和全局两个局限。
在函数中部声明的变量会被隐式的提拔(hoist)到函数头部,比方以下代码
function test() {
alert(a); // undefined, 注重不是ReferenceError
while (true) {
var a = 5;
break;
}
alert(a); // 5
}
test();
这里能两个都能alert出来没有毛病是由于,这段代码等同于以下代码
function test() {
var a; // 把函数中所有局部变量的声明都提拔到头部
alert(a);
while (true) {
a = 5;
break;
}
alert(a);
}
test();
这里就要异常警惕这类被隐式提拔的局部变量和全局变量的一些争执了,比方下面这段代码
var bird = 'sparrow';
function test() {
if (typeof bird === 'undefined') {
var bird = 'pigeon';
}
alert(bird); // pigeon
}
test();
很新鲜吧为何alert出来是pigeon而不是sparrow, 由于局部变量bird把全局变量遮盖了。而在if语句之前,局部变量bird确实是undefined。
不得不说这很tricky。
趁便有个网站能在线实行js,http://jsfiddle.net。
不过一向没发现有好的js的诠释器和调试器,在浏览器里弄略蛋疼。