Javascript 将一个函数传递给另一个函数?

Javascript 将一个函数传递给另一个函数?,javascript,function,scope,Javascript,Function,Scope,将一个函数传递给另一个使用它来减少范围查找的函数是否更好。我对这些东西感到很困惑 不把它传进来 function loadSuccess(a, b, c) { }; function image(url, name, info) { var asset = new Image(); asset.addEventListener("load", function(name, info) { return function() { loadSuc

将一个函数传递给另一个使用它来减少范围查找的函数是否更好。我对这些东西感到很困惑

不把它传进来

function loadSuccess(a, b, c) {

};

function image(url, name, info) {

   var asset = new Image();
   asset.addEventListener("load", function(name, info) {
       return function() {
           loadSuccess(this, name, info);
       };
   }(name, info), false);
   asset.src = url;
};

image(a, b, c);
function loadSuccess(a, b, c) {

};

function image(url, name, info, loadSuccess) {

   var asset = new Image();
   asset.addEventListener("load", function(name, info, func) {
       return function() {
           func(this, name, info);
       };
   }(name, info, loadSuccess), false);
   asset.src = url;
};

image(a, b, c, loadSuccess);
并把它传进来

function loadSuccess(a, b, c) {

};

function image(url, name, info) {

   var asset = new Image();
   asset.addEventListener("load", function(name, info) {
       return function() {
           loadSuccess(this, name, info);
       };
   }(name, info), false);
   asset.src = url;
};

image(a, b, c);
function loadSuccess(a, b, c) {

};

function image(url, name, info, loadSuccess) {

   var asset = new Image();
   asset.addEventListener("load", function(name, info, func) {
       return function() {
           func(this, name, info);
       };
   }(name, info, loadSuccess), false);
   asset.src = url;
};

image(a, b, c, loadSuccess);

这两种方法都很好,但我认为将回调函数作为参数发送是一种很好的做法。

这两种方法都很好,但我认为将回调函数作为参数发送是一种很好的做法。

性能优势可能是可以忽略的,但传递回调会使函数更加灵活,如果需要,允许您在不同的情况下传递不同的回调

但是,我在代码中看到了一个问题:从异步回调返回任何内容都没有意义。返回它的不是您的
image
函数,而是您传递给
addEventListener
的内部匿名函数

考虑到这些问题,我将更改代码如下:

function loadSuccess(a, b, c) {

};

function image(url, name, info, func) {
   var asset = new Image();
   asset.addEventListener("load", function(e) {
       func(this, name, info);
   }, false);
   asset.src = url;
};

image(a, b, c, loadSuccess);

我还删除了您的立即调用函数,因为我看不出有什么好的理由在那里使用它。

性能优势可能是可以忽略的,但是传递回调函数使您的函数更加灵活,允许您在不同的情况下传递不同的回调函数(如果需要)

但是,我在代码中看到了一个问题:从异步回调返回任何内容都没有意义。返回它的不是您的
image
函数,而是您传递给
addEventListener
的内部匿名函数

考虑到这些问题,我将更改代码如下:

function loadSuccess(a, b, c) {

};

function image(url, name, info, func) {
   var asset = new Image();
   asset.addEventListener("load", function(e) {
       func(this, name, info);
   }, false);
   asset.src = url;
};

image(a, b, c, loadSuccess);

我还删除了您的立即调用函数,因为我看不出有什么好的理由在那里使用它。

第一个选项是在图像函数总是需要调用此loadSucces函数时使用

第二个选项是在需要选择要执行的回调函数时使用

还有第三个选项,其中第四个参数为optionnal:

function image(url, name, info, loadSuccessParameter) {
    loadSuccessParameter= loadSuccessParameter || loadSuccess;
    [...]

}
所以你可以这样叫:image(a,b,c)或者这样叫:image(a,b,c,otherLoadSuccess)


我希望它能有所帮助。

第一个选项是在图像函数始终需要调用此loadSucces函数时使用

第二个选项是在需要选择要执行的回调函数时使用

还有第三个选项,其中第四个参数为optionnal:

function image(url, name, info, loadSuccessParameter) {
    loadSuccessParameter= loadSuccessParameter || loadSuccess;
    [...]

}
所以你可以这样叫:image(a,b,c)或者这样叫:image(a,b,c,otherLoadSuccess)


我希望这会有帮助。

很酷,我知道两者都可以,但我喜欢用标准方式编码,谢谢。很酷,我知道两者都可以,但我喜欢用标准方式编码,谢谢。
函数(…){…}(…)
应该用括号括起来,这样开发者就知道这是IIFE而不是回调。我甚至没有注意到IIFE(这使得我以前的修订错误)。现在修复了这两个问题。谢谢你,我在那里有一个匿名返回函数,因为我正在重写代码,它以前在for循环中的一个函数调用中,所以我必须维护一个闭包,以便在每次循环迭代中保留名称和信息,谢谢你发现了它,尽管我没有!@user2251919我也有错误的参数函数映像中的名称,只是修复了它。
函数(…){…}(…)
应该用括号括起来,以便开发人员知道它是一个IIFE而不是回调。我甚至没有注意到IIFE(这使得我以前的修订错误)。现在修复了这两个问题。谢谢你,我在那里有一个匿名返回函数,因为我正在重写代码,它以前在for循环中的一个函数调用中,所以我必须维护一个闭包,以便在每次循环迭代中保留名称和信息,谢谢你发现了它,尽管我没有!@user2251919我也有错误的参数函数图像中的名称,只是修复了它。