function box(){
var op = document.getElementById("op");
op.onclick = function(){
alert(op.innerHTML);
};
//alert(op);
op = null;
}
box();
function box(){
var op = document.getElementById("op");
var text = op.innerHTML;
op.onclick = function(){
alert(text);
};
//alert(op);
op = null;
}
box();
两段代码差异在把op.innerHTML赋给了text,结果就差异很大了。尾部销毁op = null没有影响到这个var text = op.innerHTML吗?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
已经把对字符串的引用传递给text了 之后改变op对这点是无法影响的
这2个例子是JAVASCRIPT高级程序设计中的经典例子。
第一个例子创建了内部匿名函数且其一直在循环引用着作用域链中的op!
请注意,这里用到了JS比较少见的垃圾回收机制,叫做引用计数。
什么叫引用计数?原话意思大概是:跟踪记录每一个值被引用的次数。也就是说当你声明一个变量并将一个引用类型值[什么叫引用类型请自己百度,你可以直接打印到控制台看看或者typeof检测]赋值给这个变量时候,那么引用计数为1,如果你又给这个变量赋值了另外一个值,那么引用计数减1。当引用计数为0的时候,JS垃圾回收机制会将其回收,你就无法再访问这个变量。
第一个例子中,明显你的op是object引用类型且被回收掉,所以你对一个无法访问的东东进行强行访问,error。
第二个例子是经典的闭包避免内存泄漏的问题,看上面说的应该很容易理解了。首先,解除闭包匿名函数的循环引用,然后回收掉。
第一次回答闭包的问题,不知道回答的对不对,请大家指正。