声明和初始化不一样
声明
var joe; // the declaration
初始化
joe = ‘plumber’; // the initialization
声明前置
你可以在函数的任何位置通过var声明变量,它们会像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(前置/置顶解析/预解析)。当你使用了一个变量,然后不久在函数中又重新声明的话,就可能产生逻辑错误。看下面这个例子:
var myname = "global";
(function() {
alert(myname);
var myname = "local";
alert(myname);
})();
在这个例子中,你可能会以为第一个alert弹出的是”global“,第二个弹出”local”。这种期许是可以理解的,因为在第一个alert 的时候,myname未声明,此时函数肯定很自然而然地看全局变量myname,但是,实际上并不是这么工作的。第一个alert会弹出”undefined“,因为myname被当做了函数的局部变量(尽管是之后声明的),所有的变量声明都被前置到函数的顶部了。因此,为了避免这种混乱,最好是预先声明你想使用的全部变量。
上面的代码片段执行的行为会像下面这样:
var myname = "global";
(function() {
var myname;
alert(myname);
myname = "local";
alert(myname);
})();
忘记var的副作用
由于JavaScript的两个特征,不自觉地创建出全局变量是出乎意料的容易。首先,你甚至可以不需要声明就可以使用变量;第二,JavaScript有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性。看下面的代码:
function sum(x, y) {
result = x + y;
result;
}
sum(1, 3);
alert(result);
此段代码中函数作用域外的 result 没有声明,代码照样运作正常,alert会弹出4。如果函数变量内不使用var,会产生一个全局变量,这就是忘记var的副作用(Side Effects When Forgetting var)。因此,要想和其他脚本成为好邻居的话,尽可能少的使用全局变量是很重要的。
想让全局变量少最重要的还是始终使用var来声明变量。