JavaScript变量介绍

来源:互联网 发布:委内瑞拉经济崩溃知乎 编辑:程序博客网 时间:2024/06/08 03:11
如何在Java$cript中定义变量?
使用var关键字,当然你可以什么都不用,当这个标识符第一次使用的时候这个变量也声明了,可这并不是一个好习惯。从这个可以看出Java$cript是一个弱类型的语言,也就是不进行类型检查。比如,你将5赋值给“i”这个变量,过一会儿你可以将"abcdefg"这个字符串赋给“i”,这没有任何问题。如下:

var i = 5;
i = "abcdefg";

我们来瞅瞅声明变量的各种方式:
var i;//这个时候你声明了i这个变量,但是它的值是 undefined
var sum;
var i,sum;
var i = 1,sum = 20,a;
上面看起来变量声明还比较简单,但是这里却有巧妙的机关,是否使用var和在哪里使用会影响到变量的作用域,也就是常说的scope。(解释一下啥叫变量的作用域,变量的作用域就是变量的生命周期,一个变量声明后并不是一直存在于程序中,随着你的程序的执行,你的变量也许就会消失在迷途中)我们来瞧瞧:
一般变量有两种作用域:全局变量(也就是说它存在于你的程序的everywhere),还有一个是局部变量(局部变量就是在方法中声明的变量,它只生活在这个方法体中,在方法外就不能访问了)
这里有一些注意点:如果在一个方法中,有一个局部变量和一个全局变量同名,那么优先使用这个局部变量
如下:
var test = "g"; //这是一个全局变量
check(){
var test = "l";//这是一个局部变量,但是它的名字却和全局变量的相同,它会隐藏全局变量
alert(test);//不信,试试,肯定弹出的框框上面的值是 "l";
}
看到这个介绍,所以编写程序的时候要留个心眼啊,尽量不要将全局变量和局部变量同名,不然会有一些怪异的行为,不过我们有的时候却故意让它们同名,来实现一些小甜饼,呵呵。
下面还有一个怪异的地方,是关于是否使用var的问题。
在方法外声明的变量叫做 全局变量,不管它是否使用了var关键字,但是在方法里面的却不同了,使用了var关键字的是局部,没有使用的就是声明了一个全局变量了

test = "g"; //没有使用var吧,它也是声明一个全局变量
check(){
test ="test";//这里是不是声明了一个同名的test局部变量呢?不是,这里只改变了全局变量的值,因为没有
                    //var关键字
g = "abc"; //没有var,这是声明了一个新的全局变量
}
//不信?我们在方法外面测试一下
alert(test); //新的值为test吧
alert(g);//是不是还能访问?值位为abc

关于Java$cript的变量还有个地方有点奇怪,在C等语言里面有块级局部变量,比如,在一个if 块里面定义一个变量,那么这个变量的作用域就会在这个if块里面,离开if块以后,这个变量就不能访问了,但是在Java$cript里却没有这个概念,看看:
check(){
   var a = 0;
  if (a == 1){
//在这个if块里面,我们定义了 j,并赋值为 1
  var j = 1;
  }
//在if块外面我们仍然能够访问j,显示的值果然是1
alert(j);
}
这就是Java$cript 所谓的在方法里面定义的变量可以影响到方法体的每个角落,就是因为这个奇怪的影响引发了一个超级奇怪的现象:
var t = "test";//这里我定义了一个全局变量
check(){
alert(t);//你说这里应该显示什么?
var t = "la,la,la";//定义一个同名的局部变量吧
alert(t);//这里又显示什么呢?
}
/告诉你吧,第一个alert显示undefined,为什么,因为Java$cript所谓的在方法里面定义的变量可以影响到方法体的每个角落,由于后面有个定义了个局部变量,它影响到这里来了(我觉得这影响也太管的宽了吧,呵呵),t在后面定义的,你这里使用所以就显示“未定义”了,唉,奇怪真奇怪。翻了很多资料,在Java$cript高级编程里面发现,原来上面的语句被解释成这个样子:
check(){
var t;//原来Java 解释的时候会把所有的声明和赋值分开,并将声明提前啊
alert(t);
t = "la,la,la";
alert(t);
}
Java$cript变量深入探讨:
一、Java$cript和C,Java不一样,它的变量是无类型的,所以Java$cript的变量可以保存任何类型的数据,一方面这带来没有类型检查,类型检查需要程序员自己来保证,另外一方面有没有类型转换的好处,这样使得好多面向对象设计模式显得不再重要。
二、关于Java$cript局部变量以及全局变量的问题,实际上在Java$cript内部维护着一个对象的链子,当要访问一个变量的时候,就会从这个链子的头部找到尾部,先在哪里找到这个变量就是哪个对象的变量,而且是就近原则。
三、在Java$cript启动解释器开始解释的时候,还没有任何一行代码执行的时候,解释器会构造一个全局对象,解释器会将所有的全局变量作为这个对象的属性,并且把向parseInt(),这样的方法业作为这个对象的方法,在客户端Java$cript(比如浏览器中)里,这个全局对象就是window

上面描述的是Java$cript变量的一些知识,关于变量还有一些更重要的东西,这就是变量的命名:国际知名对象大师Martin Flower在他的知名著作《重构》里讲过:谁都能写出机器能够读懂的代码,但是唯有能写出人能够读懂的代码才是真正的程序员。鉴于这个,我上面所有的示例代码都是不合格的,一个变量的命名要见名知意,看到了你变量的名字,就能知道你这个变量要干什么,保存的是什么东西。这才是成为一位合格的程序员的基准。
OK,这篇文章就到这么多吧,下次我们来聊聊Java$cript的流程控制。

 
原创粉丝点击