代码改变世界

重读犀牛书-变量

2010-07-08 01:57  Feather  阅读(453)  评论(4)    收藏  举报

关于声明变量

  • 对于一个没有声明的变量

若对其赋值,Javascript会隐式声明该变量,隐式声明变量总是被创建为全局变量。

若尝试读取,Javascript会生成一个“VarName未定义”的错误。

  • 对于一个 声明了但没有赋值的变量

若对其读取,会得到一个undefined.

 

 

 变量没有块级作用域

 在C#中,我们是不可以在if里面定义变量的,我感觉原因是变量声明的必须是确定,否则不利于编译。我们说这就是变量的块级作用域。

而在Javascript中,函数里声明的所有变量,无论是在哪里声明的,在整个函数中都是有定义的。

1 var scope = "global";
2 function f( ) {
3     alert(scope);         // Displays "undefined", not "global"
4     var scope = "local";  // Variable initialized here, but defined everywhere
5     alert(scope);         // Displays "local"
6 }
7 f( );
8 

 

 

 关于字符串的类型

字符串是一个特例,它有基本类型的表现(复制是复制内容而不是复制引用),也有引用类型的构造(可变大小)。

数值、布尔值、null、undefined属于基本类型;数组,对象,函数属于引用类型。 

 

 

 

全局变量是全局对象的属性,而局部变量是一个特殊的调用对象 

所谓的全局对象(Global Object)其实就是Window对象,我们创建的所有全局变量就是window对象的属性,而全局函数则是window对象的方法。 

除了我们自定义的全局变量以及函数外,window还有自己的一些自己的内置属性,如:document,navigator...他们都可以不用把window显式写出来。

说起属性,我想起在类定义属性时候需要用到的this,用下面例子一并说明吧。 

1 var word="This is the word in global."
2 document.write(word);
3 document.write(window.word);
4 document.write(window["word"]);
5 document.write(this.word);

上面输出的结果全部都是“This is the word in global.”,下面我们讨论局部变量。

 

犀牛书里面有这么一段表述:局部变量也是一个对象的属性,这个对象被称为调用对象(call object)。在执行一个函数是,函数的参数和局部变量是作为调用对象的属性而存储的。 

所以,全局变量和局部变量不同,他们依赖的对象分别是全局对象以及调用对象,作用链(Scope Chain)也就是由这些对象组成的。

需要再次强调的是,局部变量是调用对象的属性,调用对象对于用户不可见(求证?),局部变量不是函数本身的属性:

1 var word="This is the word in global."
2 function fn()
3 {
4     var word="This is the word in function.";
5     document.write(this.word);
6     }
7 fn();

上面输出的结果是“This is the word in global.”,因为函数里面的this指向的是调用该函数的对象,调用fn函数的对象是全局对象,所以this.word就输出了全局对象里面的变量。