Javascript 函数中的拾取参数和具有原始参数的回调
我如何将回调传递给一个函数以及该函数,以便使用Javascript 函数中的拾取参数和具有原始参数的回调,javascript,Javascript,我如何将回调传递给一个函数以及该函数,以便使用被调用方所需的原始参数调用回调(但用result替换第一个参数) 我举了一个例子: this.createImage: function(base64, callback) { var img = new Image(); img.src = base64; img.onLoad = function() { callback(this); // I also want to pass position here (this + arbit
被调用方所需的原始参数调用回调(但用result替换第一个参数)
我举了一个例子:
this.createImage: function(base64, callback) {
var img = new Image();
img.src = base64;
img.onLoad = function() {
callback(this); // I also want to pass position here (this + arbitrary number of arguments)
}
}
this.addToCanvas: function(item, position) {
if(!this.isImage(item)) { // assume `isImage()` check if item is Image, & skips if true
var item = this.createImage(item, this.addToCanvas);
return;
}
item.position = position;
// Supposedly here I am certain that image is an Image() and not a
// base64 string
}
因此,基本上我想知道如何才能让createImage
回调addToCanvas
,而是用原来的位置
传递,但项
代替加载的img
这里的想法是能够使用图像
或base64字符串
调用addToCanvas()
,并且仍然能够在需要时进行内部转换
但是,我仍然希望能够将createImage()
与其他需要使用其他(任意)个参数回调的函数一起重用。我想知道是否可以不将上述函数耦合在一起。您正在寻找部分参数应用程序。这是一种函数式编程技术:在纯JavaScript中,您可以这样做:
var that = this; // necessary because this has another vaue inside the wrapper function
var item = this.createImage(item, function(x) {
return that.addToCanvas(x, position)
});
// here you are passing a wrapper function, that 'waits' for an x to be passed in order to call finally addToCanvas, with x and position.
img.onLoad = function() {
callback(this); // this goes into the above's x
}
同样,使用函数库(如underline.js)看起来更优雅,如下所示:
var item = this.createImage(item, _.partial(this.addToCanvas, _, position));
您正在寻找部分参数应用程序。这是一种函数式编程技术:在纯JavaScript中,您可以这样做:
var that = this; // necessary because this has another vaue inside the wrapper function
var item = this.createImage(item, function(x) {
return that.addToCanvas(x, position)
});
// here you are passing a wrapper function, that 'waits' for an x to be passed in order to call finally addToCanvas, with x and position.
img.onLoad = function() {
callback(this); // this goes into the above's x
}
同样,使用函数库(如underline.js)看起来更优雅,如下所示:
var item = this.createImage(item, _.partial(this.addToCanvas, _, position));
我建议只使用局部函数
如果数据已经是图像,只需立即调用处理它的本地函数。如果它还不是图像,则将其转换为图像,然后从回调调用本地函数
因为本地函数可以访问传递给原始函数调用的所有参数,所以这就解决了问题的这一部分,而无需进行任何特殊的参数传递。这也是Javascript的一个重要特性(函数可以访问其所有父参数):
我建议只使用局部函数
如果数据已经是图像,只需立即调用处理它的本地函数。如果它还不是图像,则将其转换为图像,然后从回调调用本地函数
因为本地函数可以访问传递给原始函数调用的所有参数,所以这就解决了问题的这一部分,而无需进行任何特殊的参数传递。这也是Javascript的一个重要特性(函数可以访问其所有父参数):
我很难理解你想要什么。是否要使用一组参数(和不确定的数字)调用createImage()
,并将前两个参数之后的参数发送到回调?我也看不到addToCanvas()
与createImage()
有什么联系。正如您在上面显示的那样,它们根本不相关(两个都不调用另一个)。@jfriend00我想调用addToCanvas()
,如果item
不是图像,请使用createImage()
转换它,并通过回调传递原始position
参数。-第二部分:理想情况下,我应该能够从其他函数调用createImage()
,并让它用它们的原始参数调用它们,以便可以重用。更有意义吗?您将遇到的问题是,如果需要转换,将异步调用最终的onLoad
处理程序,因此item.position=position
将已经运行。因此,基本上,您需要让addToCanvas()
接收一个回调,该回调要么封装在另一个函数中并在需要转换时传递,要么在不需要转换时立即调用。@jfriend00 Yikes,正在编辑-它们现在相关,是typo@squint可能想把它总结成一个答案并启发我吗?我很难理解你想要什么。是否要使用一组参数(和不确定的数字)调用createImage()
,并将前两个参数之后的参数发送到回调?我也看不到addToCanvas()
与createImage()
有什么联系。正如您在上面显示的那样,它们根本不相关(两个都不调用另一个)。@jfriend00我想调用addToCanvas()
,如果item
不是图像,请使用createImage()
转换它,并通过回调传递原始position
参数。-第二部分:理想情况下,我应该能够从其他函数调用createImage()
,并让它用它们的原始参数调用它们,以便可以重用。更有意义吗?您将遇到的问题是,如果需要转换,将异步调用最终的onLoad
处理程序,因此item.position=position
将已经运行。因此,基本上,您需要让addToCanvas()
接收一个回调,该回调要么封装在另一个函数中并在需要转换时传递,要么在不需要转换时立即调用。@jfriend00 Yikes,正在编辑-它们现在相关,是typo@squint可能你是说不是这个。createImage(item,addIt)
而不是这个。createImage(item,doIt)
,不是吗?@NicholasKyriakides-是的,那是个打字错误。@NicholasKyriakides-我还清理了一些与新创建的图像相关的东西。因为它是从createImage()
传递到回调的,所以我让addIt()
以这种方式对齐。@jfriend00:可能应该更正他无效的函数语法。我猜他的意思是this.createImage=function(base64,callback){…
,另一个也是一样。但是+1做了一些代码清理更改。一个重要的更改是在设置后设置.src