javascript函数有生存期吗
天蓬老师
天蓬老师 2017-04-11 10:33:29
[JavaScript讨论组]

是这样的,当我们说生存期一般指的是变量或者对象,而函数在javascript中作为一个特殊的对象,是否有生存期呢

对此,我分别试着几个例子,略有疑惑,疑惑点写在了注释里:

// --------------------------例子1
(function(){
    var fun = function(){
        console.log("hi");
    };
})();
fun(); // fun is not undefined, 这里我能理解,而
// 我的疑惑在于fun指向的那个函数是否会被回收,
// 因为这个函数已经没有办法再次调用了,连名字都没有

// --------------------------例子2
var p = document.getElementById('myp');
p.addEventListener('click', function(){
    console.log("hello");
}, false);

p.removeEventListener('click', function(){
    console.log("hello");
}, false);

// 我想表达的是:当对一个p绑定一个click事件,然后又解绑,像上面的这种匿名函数的方式进行的话,那么这个函数是否会回收,还是一直存在,尽管我们没有办法再用到。


// ------------------例子三

(function(){
    function fun1(){
        ...
    }
    
    function fun2(){
        ...
    }
    
})

执行至此,fun1与fun2还存在吗,我的理解是不存在(即已经回收或等待回收),因为IIFE已经执行完了,IIFE的作用域就没了,同时内部的变量也没了,我这样理解对吗?

另外,如果我在IIFE里面,绑定一个事件,如myp.onclick = fun1;那么这个事件好像一直都会存在,这样看来又似乎IIFE内部的变量并没有消失,难道是这也算闭包。
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(4)
天蓬老师

我的理解:

  • 至少还存在一个引用的函数(或对象)不会被回收。

  • 不再有任何引用的函数(或对象),可能(至少是可以)被回收。具体要看引擎的实现。

这里的引用可能是用户代码(例如你第一个例子中的匿名函数)、库/框架代码(例如你传给jQuery的函数)、运行时环境(例如你传给setTimeout的回调函数)。

你的第一个例子中:匿名函数被局部变量fn引用,函数退出后,变量fn不可访问,所以它引用的函数可能被回收。

你的第二个例子中:传给addEventListener的函数虽然没有被你自己的代码引用,但是显然被JS运行时环境引用了,所以会一直存在,直到被remove掉。

顺便说一下,你第二个例子有问题:add和remove的不是同一个函数,所以remove无效。

天蓬老师

匿名函数的事件绑定,是不能通过remove()取消绑定的,除非是具名函数,

大家讲道理

第一个访问不到那是域的问题,fun并不在全局域里,所以访问不到。
第二个至于还存不存在那就看解绑函数的操作了

高洛峰

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management

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

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