2

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

没有传入它;

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);
4

3 回答 3

3

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

但是,我在您的代码中看到了一个问题: tt 从异步回调中返回任何内容是没有意义的。返回它的不是您的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);

我还删除了您拥有的立即调用的函数,因为我看不到在那里使用它的任何充分理由。

于 2013-06-22T17:48:27.793 回答
1

两者都可以正常工作,但我认为将回调函数作为参数发送是一种好习惯。

于 2013-06-22T17:40:56.897 回答
0

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

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

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

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

}

所以你可以这样调用:image(a, b, c) 或者这样调用:image(a, b, c, otherLoadSuccess);

我希望它有所帮助。

于 2013-06-22T17:49:09.047 回答