下面是将图像预加载到页面上的函数的源代码,作者在一些注释中添加了解释代码如何工作的内容,但我仍然不完全理解它的全部内容。具体而言,他声称此函数的返回值是一个空对象,其中“done()”方法调用预定义的匿名函数“postaction()”。该代码的用户是否应该将他/她自己的代码输入到第2行的空事后处理函数中?如果它是如何工作的,那么返回对象中的“postaction = f || postaction”会做什么?
源代码:
function preloadimages(arr){
var newimages=[], loadedimages=0
var postaction=function(){}
var arr=(typeof arr!="object")? [arr] : arr
function imageloadpost(){
loadedimages++
if (loadedimages==arr.length){
postaction(newimages) //call postaction and pass in newimages array as parameter
}
}
for (var i=0; i<arr.length; i++){
newimages[i]=new Image()
newimages[i].src=arr[i]
newimages[i].onload=function(){
imageloadpost()
}
newimages[i].onerror=function(){
imageloadpost()
}
}
return { //return blank object with done() method
done:function(f){
postaction=f || postaction
//remember user defined callback functions to be called when images load
}
}
}
链接到作者的页面:http://www.javascriptkit.com/javatutors/preloadimagesplus.shtml
答案 0 :(得分:2)
你可以为postaction输入你自己的函数,虽然它不是你想象的回调函数。
但是,它返回一个带有done函数的对象。
如果你做的话。像
preloadimages().done(function () {
console.log('done')
});
您的功能将被执行。如果你没有提供fnction作为done的参数,那么默认的postaction将被调用并且什么都不做,因为它是一个空函数
答案 1 :(得分:1)
通过阅读该代码,您似乎并不打算重新定义postaction()
- 事实上,您根本不必修改任何此代码。实际上,您希望将函数作为参数传递给done()
函数,稍后将在成功加载图像时调用该函数(回调&#39;函数)。
这一行:
postaction=f || postaction
如果 f 有值,表示&#34;将 f 的值分配给 postaction ,否则指定 postaction 强>对自己&#34; (即不要改变它)。
答案 2 :(得分:1)
我不知道这个代码究竟用于什么,但返回的对象有一个完成的函数,可以使用或不使用函数参数。
在完成之后,这句话
f || postaction
含义f OR postaction返回f如果f不为null / undefined或postaction,那么如果你调用
myreturnObject.done();
这评估为
postaction = postaction
因为f未定义。如果你打电话
myreturnObject.done(function(newImages) { ... });
这评估为
postaction = f.
然后在imageLoadPost函数的for循环中使用Postaction。如果你想在那里有一些自己的编码,你可以将它作为参数传递给done方法,如图所示。如果您不需要任何其他编码,请不要将函数传递给postaction。然后将调用定义为回退的空事后处理函数。