关于凌散变量的问题
Javascript允许在函数的任意地方声明多个变量,无论在哪里声明,效果都等同于在函数顶部进行声明。这是所谓的“提升”。当先使用变量再在函数后面声明变量时可能会导致逻辑错误。对Javascript而言,只要变量是在同一个范围(同一函数)里,就视为已经声明,哪怕是在变量声明前就使用。对于下面的例子:
myname = "global";//全局变量
function func(){
alert(myname);//“未定义”
var myname = "local";
alert(myname);//“局部变量”
}
func();
在这个例子中,可能会以为第一个alert()会提示为“全局变量”,第二个会提示“局部变量”,这是一个合乎情理的期望,因为第一个alert中,myname没有声明,因此函数很可能“看到”全局变量myname。但事实上并不是这样,第一个alert会被指明为“未定义”,因为myname被看做声明为函数的本地变量(尽管是在后面声明)。所有的变量声明都提升到函数的最顶层。因此,为了避免这类混乱,最好在开始就声明要用的所有变量。
前面的代码运行结果和以下代码一样。
myname = "global";//全局变量
function func(){
var myname;//等同于var myname = undefined;
alert(myname);
myname = "local";
alert(myname);
}
func();