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