js是非类型的,与C、java之类的区别。因此变量可以赋值任何类型。
与java不同的变量声明并初始化: i=1;
js会隐式声明变量i,这样声明出来的是全局变量。我很讨厌这种方式。但是这肯定有点方便的效果在里头,比如你代码写到一半突然想声明个全局的然后你又懒得跳到开头去声明,直接函数中来这么一句i=1;
直接导致代码很难看,蛋疼玩意。。。
正常写法是 var i;你可以重复声明并初始化一个变量,效果只不过是重新赋值。这样设计的目的只是为了一些粗心的傻瓜方便而已。
所以只需要知道 var i; 这就是js的变量声明。哪天蹦出个i=3;也要看得懂。
变量的作用域:
与其他高级语言一样,js分全局变量和局部变量。所谓局部就是函数内的变量。局部变量的优先级比全局高,因为我的地盘我做主。切记局部变量声明要用var。不用var的结果就是之前说的蛋疼玩意。
再次强调声明变量要用var,否则在函数操作变量的时候如果使用了全局变量就会有改变程序的其他部分所使用的值的危险。
js没有块级作用域。大概是比如一个if(){块级作用域}。这与C、C++、JAVA不同。
因此在一个函数中声明的变量在整个函数中都是有定义的。参看如下代码:
function test(o) {
var i = 0;
if (typeof o == 'object') {
var j = 0;
for (var k = 0; k < 10; k++) {
document.write(k);
}
document.write(k);
}
document.write(j);
}
在java中,这样的代码会报错,因为for循环外面 的两个语句对k和j的访问都会出错。但是在js中不会。即使你在if(){}中声明了变量,但是在整个函数里,这个被声明的变量都是可见的。不过如果在{}外面,那么这个访问变量它的值会是undefined。如果我们再添一行test(1); 这段代码在浏览器里的结果是undefined。
注意:未定义的话js不会报错,因为默认值是undefined。而未声明的话会代码报错无法执行。
再来一个例子:
var scope='global';
function f() {
alert(scope);
var scope='local';
alert(scope);
}
f();
它的结果会让你大吃一斤。因为它的结果跟如下代码没有区别:
function f () {
var scope;
alert(scope);
scope='local';
alert(scope);
}
这两个例子说明了为什么将所有变量声明集中起来放置在函数的开头是个好的编程习惯。我觉得还得加一条,最好别搞什么同名变量。否则如果js理论不是很精通的话很容易出现一些让人匪夷所思的问题。比如这个例子
顺便说一下,js的变量与对象里的属性基本上是一样的。