javascript解释器中存在一种变量声明被提升(hoisting)的机制,即变量(函数)的声明会被提升到作用域的最前面。即使把声明代码写在最后面。
alert(foo); //function foo(){} alert(bar); //undefined var bar = function(){}; function foo(){}; alert(foo); //function foo(){} alert(bar); //function bar(){}
从上例也能看出函数声明和函数表达式的不同的一个地方。
在javascript中也要注意另外一个变量和函数重名的问题:
function foo(){ //body } foo = 5;
2014/05/29
js中还有变量对象的概念(VO variable ojbect),它与执行上下文有关,用于存储数据和访问数据。
用于存储的数据包括:
1、函数参数
2、函数声明
3、变量声明
当进入执行上下文时,VO将会按照下面的顺序初始化:
1、函数参数:VO的一个属性,这个有形参名称和值组成,如果没有传递实参,那就是形参名称和undefined;
2、函数声明:由函数的名称和值组成,如果VO中存在该属性名称,则替换这个属性的属性值;
3、变量声明:由变量名称和undefined组成,如果变量名和VO中的函数参数或者函数声明相同,则变量声明不会干扰已存在的属性。
http://www.cnblogs.com/TomXu/archive/2012/01/16/2309728.html