function test(){ alert(a); var a = 10; } test();
运行结果是 Undefined 。这与书上写的 “函数中的任何位置定义的变量在该函数中的任何地方都可见(《javascript语言精粹》第36页)” 似乎是矛盾的。想请教各位,我可能在什么地方理解有误。
不矛盾的,JavaScript会加载或者说是解析两次
第一次:解析加载变量声明,函数声明,对函数的参数赋值
第二次:给变量赋值,执行函数
因为js是顺序加载,即从上到下,所以在函数中,的加载顺序是这样的:
// 无变量声明 1 function test(){ // 参数赋值 2.1 无参数,所以无参数赋值 var a ; // 声明变量 2.2 变量声明总会优先于变量赋值,所以就有“变量提示”这一说 // 无函数声明 2.3 alert(a);// 执行函数 2.4 a因为没有赋值,所以是undefined a = 10; // 赋值变量 2.5 a现在被赋值了 a = 10 } test(); // 2 这里挺关键的 分解看是 声明函数表达式 + 执行函数 ==> test + () // 在声明的时候会跳到函数表达式声明的地方
总结:
变量提升(hoist),这段代码相当于:
function test() { var a; alert(a); // undefined a = 10; }
这段代码在c语言中是不能运行的,因为a变量未定义啊,但javascript中可以啊,a定义了,只是没赋值。 你把下面var a = 10;注释掉 就看出区别来了
不矛盾的,JavaScript会加载或者说是解析两次
第一次:解析加载变量声明,函数声明,对函数的参数赋值
第二次:给变量赋值,执行函数
因为js是顺序加载,即从上到下,所以在函数中,的加载顺序是这样的:
总结:
变量提升(hoist),这段代码相当于:
这段代码在c语言中是不能运行的,因为a变量未定义啊,但javascript中可以啊,a定义了,只是没赋值。
你把下面var a = 10;注释掉 就看出区别来了