JS怎么在事件绑定的闭包内控制外部函数的返回值? 财富值81

2016-10-19 17:00发布

1.函数功能:我现在有一个函数,这个函数可以传递一个参数进去。这个函数的主要功能是绑定各种事件处理函数,这些绑定的事件处理函数将会对传递进去的参数进行处理,并最终将处理后的结果通过闭包外的函数返回出去。
2.遇到的问题:事件处理函数是一些闭包,我不清楚怎么在闭包内控制外部函数的返回值。
3.代码比如是这样:

var canvas = document.getElementById("#canvas"); // 一个已经存在的canvas元素  function test(canvas, src) { // src是一个图片的url     var context = canvas.getContext("2d");     var img = new Image();     img.src = src;     img.onload= function() {         context.drawImage(img, 0, 0, 100, 100);         return canvas; // 预期目标是在这里实现外部函数test返回新的canvas对象     }; }  var newCanvas =  test(canvas, "abc.png"); //在此处预期取得新的canvas对象供别处使用

4.问题补充说明:
一、预期是:处理过后的新canvas对象作为test函数的返回值,但是如果在闭包外写return,返回的值将会是未经处理的canvas,所以我觉得应该在img.onload对应的闭包内将新的canvas传递出去返回,但是不知道怎么实现;
二:必须要作为返回值传出,因为我还有别的函数依赖于这个新的canvas传递过去才能执行,所以需要取得返回值以后才能执行。
三:可能我的示例代码不够清楚,其实这里var newCanvas = test(canvas, "abc.png");我原来代码中newCanvas是一个已经建立的访问器变量,在给它赋值的时候会调用访问器里的setter,这样就可以让img加载完以后立刻执行想执行的指令。类似于监听数据变化,根据数据变化执行指令一样。而且只要给不同的访问器变量赋值,就可以执行不同的指令。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答

使用回调函数吧:

你这个canvas是全局的,可以直接用,返回干啥

这也是你问题的原因所在。

首先需要明确的一点就是JavaScript的数据类型,引用类型

mishen - whatsns产品经理
5楼-- · 2016-10-19 17:30

引用类型也就是我们常说的对象。它的值是一个指针地址。指向了堆中的实际对象。

所以,最终还是建议你根本就不需要返回一个新对象啊!!!!不用那么麻烦阿。

duoyuan120
7楼-- · 2016-10-19 17:33

本人不才,目前所知道的是使用对象的复制来解决。好像有两个吧,记不清了。
Object.assign({}, obj)Object.create(obj)create是继承形式。assign是拷贝形式。
但该方案似乎对你的问题也不会有太大帮助。

所以当你试图在函数中传递对象参数。传递的就是引用值,你在该引用上的修改直接映射到堆中数据。在函数中返回一个引用值时,事实上该值仍然指向的原始的数据。

一周热门 更多>