1

下面是一个将图像预加载到页面上的函数的源代码,作者添加了一些注释来解释代码是如何工作的,但我仍然没有完全理解它。具体来说,他声称这个函数的返回值是一个空对象,带有一个调用预定义匿名函数“postaction()”的“done()”方法。此代码的用户是否应该在第 2 行的空 postaction 函数中输入他/她自己的代码?如果它是这样工作的,那么返回对象中的“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

4

3 回答 3

2

您可以为 postaction 输入自己的函数,尽管它不是您可能期望的回调函数。

但是,它会返回一个带有 done 函数的对象。

如果你这样做。像

 preloadimages().done(function () {
     console.log('done')
 });

你的函数将被执行。如果你不提供函数作为 done 的参数,默认的 postaction 将被调用并且什么都不做,因为它是一个空函数

于 2012-08-01T14:01:17.723 回答
1

通过阅读该代码,您似乎并不打算重新定义postaction()- 事实上,您根本不需要修改任何代码。实际上,您应该将函数作为参数传递给done()函数,稍后将在成功加载图像时调用该函数(“回调”函数)。

这一行:

postaction=f || postaction

表示“如果f有值,则将 f 的值分配给 postaction,否则将postaction分配自己”(即不要更改它)。

于 2012-08-01T14:02:55.300 回答
1

我不知道这段代码到底是做什么用的,但是返回的对象有一个函数 done 可以使用或不使用函数参数。

在完成之内,这个语句

f || postaction

含义 f OR postaction 返回 f 如果 f 不是 null/undefined 或 postaction else,所以如果你打电话

myreturnObject.done();

这评估为

postaction = postaction

因为 f 没有定义。如果你打电话

myreturnObject.done(function(newImages) { ... });

这评估为

postaction = f.

然后在 imageLoadPost 函数的 for 循环中使用 Postaction。如果你想要一些自己的编码,你可以将它作为参数传递给 done 方法,如图所示。如果您在那里不需要任何额外的编码,请不要将函数传递给 postaction。然后将调用定义为回退的空 postaction 函数。

于 2012-08-01T14:05:47.913 回答