这样代码能执行吗?

hel_ 2018-08-23 05:45:56
如下代码:
function getImg(url) {
return Promise(function(resolve, reject) {
var img = new Image();

img.onload = function() {
resolve(this);
};

img.onerror = function(err) {
reject(err);
};

img.url = url;
});
};
这个this应该指的img对象,因为是异步执行,onload事件触发时,
img早已过了变量作用域,img对象会不会已经被垃圾回收器回收?
假如上面程序可以正常执行,为什么?img为什么没被回收?
...全文
91 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hel_ 2018-08-23
  • 打赏
  • 举报
回复
现在发现竟然是大神回答了问题,真是荣幸之至,看了下,应该确实是闭包的概念我需要学习,向大神致敬!
hel_ 2018-08-23
  • 打赏
  • 举报
回复
谢谢楼上指点,我去学习学习“闭包”
天际的海浪 2018-08-23
  • 打赏
  • 举报
回复
js中有一个“闭包”的特性,你可以去看看。
hel_ 2018-08-23
  • 打赏
  • 举报
回复
谢谢楼上,只是我对JS的垃圾回收机制不太明白,img的作用域不是函数吗?到函数执行完毕就释放了。在执行onload事件时,函数不是已经执行完毕了吗?为什么不释放img?JS怎么知道这个img对象执行完函数不需要释放?JS对所有的异步对象有一个缓存保存他们吗?
本人刚接触JS,在C#里面类似情况是不允许的,就会引用到已经释放的对象
安静の等待 2018-08-23
  • 打赏
  • 举报
回复
首先,你要明白promise,他有三个状态,pending,fullfilled,reject。Promise的参数是个执行器函数,它的两个参数resolve和reject分别为成功和失败时调用,然后将状态从pending变为fullfilled或者reject。当img成功是在onload里面执行resolve,失败时在onerror调用reject,resolve里面的this指调用者img,即Image的实例对象。img对象当然不会被回收,因为还没执行完,不会垃圾回收,你可以手动回收img = null

87,843

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧