javascript - JS闭包中元素驻留问题
黄舟
黄舟 2017-04-10 16:05:23
[JavaScript讨论组]
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吗?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(3)
PHP中文网
var a = {url:'segmentfault.com'}; // 声明变量 a ,并且赋值,值是一个对象,对象有个属性url,url的值'segmentfault.com'
var b = a; // 声明变量b, 并且赋值,值是a的**值**
var c = a.url;  // 声明变量c, 并且赋值,值是a属性url的**值**

console.log(a, b, c);

a = {url:'segmentfault.com/q/1010000003922462'}; // 变量 a 赋值,值是一个对象,对象有个属性url,url的值'segmentfault.com/q/1010000003922462'
console.log(a, b, c);

a = null; // 变量 a 赋值,值是null
console.log(a, b, c);
巴扎黑

已经把对字符串的引用传递给text了 之后改变op对这点是无法影响的

迷茫

这2个例子是JAVASCRIPT高级程序设计中的经典例子。
第一个例子创建了内部匿名函数且其一直在循环引用着作用域链中的op!
请注意,这里用到了JS比较少见的垃圾回收机制,叫做引用计数。
什么叫引用计数?原话意思大概是:跟踪记录每一个值被引用的次数。也就是说当你声明一个变量并将一个引用类型值[什么叫引用类型请自己百度,你可以直接打印到控制台看看或者typeof检测]赋值给这个变量时候,那么引用计数为1,如果你又给这个变量赋值了另外一个值,那么引用计数减1。当引用计数为0的时候,JS垃圾回收机制会将其回收,你就无法再访问这个变量。
第一个例子中,明显你的op是object引用类型且被回收掉,所以你对一个无法访问的东东进行强行访问,error。

第二个例子是经典的闭包避免内存泄漏的问题,看上面说的应该很容易理解了。首先,解除闭包匿名函数的循环引用,然后回收掉。

第一次回答闭包的问题,不知道回答的对不对,请大家指正。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号