【问题标题】:Anonymous functions in javascript and empty return objectsjavascript中的匿名函数和空返回对象
【发布时间】:2012-07-30 10:35:29
【问题描述】:

下面是一个将图片预加载到页面上的函数的源代码,作者添加了一些cmets来解释代码是如何工作的,但是我仍然没有完全理解它。具体来说,他声称这个函数的返回值是一个空对象,带有一个调用预定义匿名函数“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

【问题讨论】:

  • 如果对象为空,则不会包含 done 方法。
  • 在作者的页面上,他将其称为空对象
  • 看起来他错误地使用了“空白对象”一词来表示object literal
  • 另外,一个函数调用 postaction不能是一个匿名函数,你(或外部)的意思可能是一个惰性或空函数:调用它不会做除了隐式返回undefined

标签: javascript object callback return anonymous-function


【解决方案1】:

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

完成后,此语句

f || postaction

意思是 f OR postaction 返回 f 如果 f 不是 null/undefined 或者 postaction else,所以如果你调用

myreturnObject.done();

计算结果为

postaction = postaction

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

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

计算结果为

postaction = f.

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

【讨论】:

    【解决方案2】:

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

    这一行:

    postaction=f || postaction
    

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

    【讨论】:

      【解决方案3】:

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

      但是,它返回一个包含完成函数的对象。

      如果你这样做。喜欢

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-05
        • 1970-01-01
        • 1970-01-01
        • 2022-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多