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

时间:2013-06-22 17:36:43

标签: 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() {
           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);

3 个答案:

答案 0 :(得分:3)

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

但是,我发现代码中存在问题:从异步回调中返回任何内容都没有意义。它不是你的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);

我还删除了你所拥有的即时调用函数,因为我没有看到任何有理由在那里使用它。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

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

}

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

我希望它有所帮助。