class="
cnt">
Javascript的变量
实际上Javascript中c;变量 = 对象属性c;这是因为 Javascript 在执行脚本之前会创建一个Global对象c;所有的全局变量都是这个Global对象的属性c;执行函数时也会创建一个Activation对象c;所有的局部变量都是这个Activation对象的属性。如下例:
var global = 42;
this.global; // 42, 可以通过this来访问Global对象
this.global2 = 12;
global2; // 12
class="tags" href="/tags/FUNCTION.html" title=function>function foo() {
var local = 36;
// 不过无法直接访问Activationc;
// 因此无法通过 foo.local 的方式来访问local变量
}
class="tags" href="/tags/DELETE.html" title=delete>delete操作符删除的对象
C++中也有class="tags" href="/tags/DELETE.html" title=delete>delete操作符c;它删除的是指针所指向的对象。例如:
// C++
class Object {
public:
Object *x;
}
Object o;
o.x = new Object();
class="tags" href="/tags/DELETE.html" title=delete>delete o.x; // 上一行new的Object对象将被释放
但Javascript的class="tags" href="/tags/DELETE.html" title=delete>delete与C++不同c;它不会删除o.x指向的对象c;而是删除o.x属性本身。
// Javascript
var o = {};
o.x = new Object();
class="tags" href="/tags/DELETE.html" title=delete>delete o.x; // 上一行new的Object对象依然存在
o.x; // undefinedc;o的名为x的属性被删除了
在实际的Javascript中c;class="tags" href="/tags/DELETE.html" title=delete>delete o.x之后c;Object对象会由于失去了引用而被垃圾回收c;所以class="tags" href="/tags/DELETE.html" title=delete>delete o.x也就“相当于”删除了o.x所指向的对象c;但这个动作并不是ECMAScript标准c;也就是说c;即使某个实现完全不删除Object对象c;也不算是违反ECMAScript标准。
“删除属性而不是删除对象”这一点c;可以通过以下的代码来确认。
var o = {};
var a = { x: 10 };
o.a = a;
class="tags" href="/tags/DELETE.html" title=delete>delete o.a; // o.a属性被删除
o.a; // undefined
a.x; // 10, 因为{ x: 10 } 对象依然被 a 引用c;所以不会被回收
另外c;class="tags" href="/tags/DELETE.html" title=delete>delete o.x 也可以写作 class="tags" href="/tags/DELETE.html" title=delete>delete o["x"]c;两者效果相同。
对变量执行class="tags" href="/tags/DELETE.html" title=delete>delete的情况
由于变量也是 Global 或者是 Activation 对象的属性c;所以对变量的class="tags" href="/tags/DELETE.html" title=delete>delete操作也是同样的结果。
var global = 42;
class="tags" href="/tags/DELETE.html" title=delete>delete global; // 删除Global.global
class="tags" href="/tags/FUNCTION.html" title=function>function foo() {
var local = 36;
class="tags" href="/tags/DELETE.html" title=delete>delete local; // 删除Activation.local
}
能删除的属性和不能删除的属性
并不是所有的属性都能被class="tags" href="/tags/DELETE.html" title=delete>delete。例如c;class="tags" href="/tags/PROTOTYPE.html" title=prototype>prototype中声明的属性就无法被class="tags" href="/tags/DELETE.html" title=delete>delete:
class="tags" href="/tags/FUNCTION.html" title=function>function C() { this.x = 42; }
C.class="tags" href="/tags/PROTOTYPE.html" title=prototype>prototype.x = 12;
var o = new C();
o.x; // 42, 构造函数中定义的o.x
class="tags" href="/tags/DELETE.html" title=delete>delete o.x;
o.x; // 12, class="tags" href="/tags/PROTOTYPE.html" title=prototype>prototype中定义的o.xc;即使再次执行class="tags" href="/tags/DELETE.html" title=delete>delete o.x也不会被删除
对象的预定义属性也无法删除。 可以认为这类属性带有DontDelete的特性。
var re = /abc/i;
class="tags" href="/tags/DELETE.html" title=delete>delete re.ignoreCase;
re.ignoreCase; // true, ignoreCase无法删除
能删除的变量和不能删除的变量
通过var声明的变量和通过class="tags" href="/tags/FUNCTION.html" title=function>function声明的函数拥有DontDelete特性c;无法被删除。
var x = 36;
class="tags" href="/tags/DELETE.html" title=delete>delete x;
x; // 36, x没有被删除
y = 12;
class="tags" href="/tags/DELETE.html" title=delete>delete y;
y; // undefined
class="tags" href="/tags/FUNCTION.html" title=function>function foo() { return 42; }
class="tags" href="/tags/DELETE.html" title=delete>delete foo;
foo(); // 42
但是有一点例外c;就是通过 eval 执行的代码中c;通过var声明的变量虽然与正常的var声明变量同属于Global对象c;但它们不具有DontDelete特性c;能被删除。
eval("var x = 36;");
x; // 42
class="tags" href="/tags/DELETE.html" title=delete>delete x;
x; // undefined
但是这也有一点例外c;eval的代码中的函数内通过var定义的变量具有DontDeletec;不能被删除。
eval("(class="tags" href="/tags/FUNCTION.html" title=function>function() { var x = 42; class="tags" href="/tags/DELETE.html" title=delete>delete x; return x; })();");
// 返回 42
class="tags" href="/tags/DELETE.html" title=delete>delete的返回值
class="tags" href="/tags/DELETE.html" title=delete>delete是普通运算符c;会返回true或false。规则为:当被class="tags" href="/tags/DELETE.html" title=delete>delete的对象的属性存在并且拥有DontDelete时返回falsec;否则返回true。这里的一个特点就是c;对象属性不存在时也返回truec;所以返回值并非完全等同于删除成功与否。
class="tags" href="/tags/FUNCTION.html" title=function>function C() { this.x = 42; }
C.class="tags" href="/tags/PROTOTYPE.html" title=prototype>prototype.y = 12;
var o = new C();
class="tags" href="/tags/DELETE.html" title=delete>delete o.x; // true
o.x; // undefined
"x" in o; // false
// o.x存在并且没有DontDeletec;返回true
class="tags" href="/tags/DELETE.html" title=delete>delete o.y; // true
o.y; // 12
// o自身没有o.y属性c;所以返回true
// 从这里也可以看到class="tags" href="/tags/PROTOTYPE.html" title=prototype>prototype链的存在c;对象自身属性和class="tags" href="/tags/PROTOTYPE.html" title=prototype>prototype属性是不同的
class="tags" href="/tags/DELETE.html" title=delete>delete o; // false
// Global.o拥有DontDelete特性所以返回false
class="tags" href="/tags/DELETE.html" title=delete>delete undefinedProperty; // true
// Global没有名为undefinedProperty的属性因此返回true
class="tags" href="/tags/DELETE.html" title=delete>delete 42; // true
// 42不是属性所以返回true。有的实现会抛出异常(违反ECMAScript标准)
var x = 24;
class="tags" href="/tags/DELETE.html" title=delete>delete x++; // true
x; // 25
// 被删除的是x++的返回值(24)c;不是属性c;所以返回true
原文:http://tech.idv2.com/2008/01/09/class="tags" href="/tags/JAVASCRIPT.html" title=javascript>javascript-variables-and-class="tags" href="/tags/DELETE.html" title=delete>delete-operator/