重读犀牛书-变量
2010-07-08 01:57 Feather 阅读(453) 评论(4) 收藏 举报关于声明变量
- 对于一个没有声明的变量
若对其赋值,Javascript会隐式声明该变量,隐式声明变量总是被创建为全局变量。
若尝试读取,Javascript会生成一个“VarName未定义”的错误。
- 对于一个 声明了但没有赋值的变量
若对其读取,会得到一个undefined.
变量没有块级作用域
在C#中,我们是不可以在if里面定义变量的,我感觉原因是变量声明的必须是确定,否则不利于编译。我们说这就是变量的块级作用域。
而在Javascript中,函数里声明的所有变量,无论是在哪里声明的,在整个函数中都是有定义的。
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,用下面例子一并说明吧。
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)也就是由这些对象组成的。
需要再次强调的是,局部变量是调用对象的属性,调用对象对于用户不可见(求证?),局部变量不是函数本身的属性:
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就输出了全局对象里面的变量。
浙公网安备 33010602011771号