将函数传递给另一个使用它来减少范围查找的函数是更好的做法。我对这些东西感到很困惑。
不传递;
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);
答案 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);
我希望它有所帮助。