javascript 关于声明变量的细节
对与刚接触javascript的童鞋来说,尤其是学过java的同学,一时半会还需要对javascript的语法格式需要一段时间的适应。
以下内容只是鄙人的一些粗浅总结,希望看过的觉的不足之处可与我探讨,我会通过与java语言的对比,加深对javascript的理解和学习,相信会有所裨益。
关于javascript的变量声明
首先,java变量的声明,是需要同时声明变量类型的,而javascript与java最只要的一个区别是:untype(非类型),也就是什么变量都能装。一个javascript变量,你可以先赋值数字,然后再赋值一个字符串,这是完全合法的,不管何种类型的变量(数字,Array,对象,String)统一用 var标识符进行声明。
var i = 30; var i = "hello,javascript!";
当我们,声明变量但没有初始化,其变量的值为“undefind”,在java中没有初始化的变量其默认值是根据其变量类型来指定的。
使用var语句对同一个变量进行多次声明是合法的,如果其多次声明有初始值,那么var语句将会是赋值语句的角色。(小知识点,知不知道都无所谓)。
如果读取一个未声明变量,javascript会报错。
如果没有var一个变量,其会隐式的为其声明, 比如直接写: i=0; 是可以的。但要注意的是,隐式声明变量只会将变量声明为全局变量,哪怕这个变量在一个函数内。如:
function a(){ i=100; }
就相当于:
var i; //隐式声明 function a(){ i=100; }
红色的部分是隐式的,也就是说即便你不写这一句,程序是不会报错的,但会不会改变程序初衷,就不一定了,而在java中这是不允许的。值得注意的是,即便这样,我们还是最好在声明变量时加上var,防止在一个函数体内声明一个局部变量时变成全局变量,与程序中现有的全局变量冲突,改变了程序的初衷。
说道函数,说一些题外话,在javascript中函数中不仅可以调用函数,也可以嵌套定义函数,也就是说函数体内可以定义函数,在java中只能函数中调用函数,不可定义函数。
javascript函数中定义的变量,在整个函数体内都有作用,只有函数结束,才失去作用。如以下代码:
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代码,红色标识的代码,那么编译不会通过,system.out.print(k);k一定没有声明,在java语法中k的作用域只在for循环语句中,for循环结束,那么k的生命周期也就结束。同理j也一样,它的生命周期只在if语句块中。但是在javascript中,这是合法的。比较容易让人难以理解,记下来就好,千万别和java搞混。
未定义的变量和未赋值的变量
在js开发中,在读取或引用某些变量时总会发生一些莫名其妙的状况,多数问题是因为某些变量没有定义或者赋值,也或许是因为经常将未赋值和未定义的变量弄混,以至于不能很好的控制这两种不同类型的未定义变量。
第一种,前面说过,为未经过声明的变量赋值,程序会隐式的在全局作用域中声明成全局变量。
第二种,是已经声明了,但是永远都不会被赋值的变量,如果要读取这样的变量的值,将会得到一个默认值undefind,前面也说过。
最后,undefind 和java中的null是不一样的,javascript中也有null这个值。