看好了《JavaScript 编程艺术》后,现在在看《JavaScript : The Definitive Guide》,在看这本书的时候,才发现了很多JavaScript很多不同于其他编程语言的地方。今天首先介绍一个JavaScript中的变量,讲讲我看完《JavaScript : The Definitive Guide》后的收获。
在JavaScript中,我们是使用var量变量声明的。但是JavaScript中弱类型的语言,所以我们在JavaScript中,我们可以不声明一个变量,就能使用一个对象了。但是当我们没有使用var,就开始使用一个变量后,这个变量是作为一个全局变量的。
function func() {
var x = 1;
y = 2;
}如上面的代码,x是最为func中的一个local 变量,但是y是一个global变量。 在JavaScript中,undefined和null都是两个特殊的值。我们首先来介绍一些null,这个主要是只这个值是一个空值,这个和在Java中比较的相似。如果一个boolean类型的变量为null,则会转变为false,number类型的变为0,string的话编程"null"。
undefined,则表示一个变量是声明了但是没有赋过值,或者表示一个对象的属性不存在。如下面两种情况。
var aass;
var my = new Object();
my.op上面两种情况,因为aass没有赋过值,my.op这个属性是没有的,所以上面两个都是undefined的。 虽然我们在字面上看null和undefine是不一样的,但是当我们使用==来进行两个比较的话,我们会发现undefined和null是相等的。即如下的情况
var aass;
aass == null //true
var my = new Object();
my.op == null //true
在上面那张图中,显示出来JavaScript中的变量的Scope Chain。对于这个Chain的理解还是很重要的,后面的文章中,会讲到有关Closure时,我们会再次提到这个Chain。这里我们会发现,JavaScript中的变量的作用域和Java、C++中比较的相似,及函数中的局部变量将会覆盖外层的变量。
var x = 1;
function f1() {
alert(x); // 1
var y = 2;
function f2() {
var y = 3;
alert(y); // 3
}
alert(y); // 2;
f2();
}
f1();我们会发现上面的会一次是1 , 2 , 3。但是在JavaScript中没有块级别的变量域。即我们在Java中,如下for (int i=0 ; i<10 ; i++) {
}
int i = 1;所以在上面,循环中的i和循环后的i是不一样的。但是在JavaScript中,有些不相同,如下:var i = 1;
var i;
alert(i);这样将看到,虽然我们再次声明了i,但是i的值还是1。 这里我们介绍一个特殊的情况,来介绍JavaScript中的变量声明。JavaScript在一个域中声明后,在整个域中都是存在的,不管是在开头处声明,还是在最后声明,作用域都是整个域的。
var x = 1;
function f1() {
alert(x);
var x = 2;
function f2() {
var x = 3;
alert(x);
}
f2();
}
f1();如上面的那段代码,可能和你所期望的结果有所不同。因为第二个x是在f1域中的,所以虽然是在alert(x)后面才声明的,但是作用域是整个f1域的,所以上面那段代码和下面代码的作用是相同的。var x = 1;
function f1() {
var x;
alert(x);
x = 2;
function f2() {
var x = 3;
alert(x);
}
f2();
}
f1(); 最后讲一个我在写程序的时候碰到的一个例子。
for (var i=0 ; i<10 ; i++) {
buttons[i].onclick = function() {
alert(i);
}
}如果按照上面的做法,我们会发现不管我们点击什么,我们得到的结果都是10。这个问题的原因我们将在下面的文章中提及,这里我们有两种方法解决。一种是把i当做buttons[i]的一个属性,这样我们在点击的时候,就能通过button的属性来获得值。window.onload = test;
function test(){
var buttons = document.getElementsByTagName("button");
for (var i=0 ; i<buttons.length ; i++) {
buttons[i].i = i;
buttons[i].onclick = function() {
alert(this.i);
}
}
}第二个我们可以通过匿名函数来解决这个问题window.onload = test;
function test(){
var buttons = document.getElementsByTagName("button");
for (var i=0 ; i<buttons.length ; i++) {
(function(i) {
buttons[i].onclick = function() {
alert(i);
}
})(i);
}
}上面就是我看书后的一点心得,后面继续更新其他的。版权声明:本文为sunnybuer原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。