日期:2014-05-16  浏览次数:20322 次

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这个值。