1

以下は、画像をページにプリロードする関数のソース コードです。作成者は、コードがどのように機能するかを説明するためにいくつかのコメントを追加しましたが、まだすべてを完全には理解していません。具体的に言うと、彼は、この関数の戻り値は、定義済みの無名関数「postaction()」を呼び出す「done()」メソッドを持つ空のオブジェクトであると主張しています。このコードのユーザーは、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

4

3 に答える 3

2

期待するようなコールバック関数ではありませんが、ポストアクション用に独自の関数を入力できます。

ただし、done 関数を含むオブジェクトを返します。

そうするなら。お気に入り

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

関数が実行されます。関数を done のパラメーターとして指定しない場合、空の関数であるため、デフォルトのポストアクションが呼び出されて何もしません。

于 2012-08-01T14:01:17.723 に答える
1

そのコードを読むと、再定義するつもりはないように見えます。postaction()実際、このコードを変更する必要はまったくありません。実際には、関数を引数として関数に渡すことが期待されています。このdone()関数は、後で画像の読み込みが成功すると呼び出されます(「コールバック」関数)。

この行:

postaction=f || postaction

「fに値がある場合はfの値をpostaction割り当てそれ以外の場合はpostactionをそれ自体に割り当てる」ことを意味します(つまり、変更しないでください)。

于 2012-08-01T14:02:55.300 に答える
1

このコードの正確な用途はわかりませんが、返されたオブジェクトには、関数パラメーターの有無にかかわらず使用できる関数が含まれています。

完了内で、このステートメント

f || postaction

意味 f OR ポストアクションは、f が null/undefined でない場合、またはポストアクションがそれ以外の場合は f を返します。

myreturnObject.done();

これは次のように評価されます

postaction = postaction

f が定義されていないためです。電話すれば

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

これは次のように評価されます

postaction = f.

その後、postaction が imageLoadPost 関数の for ループ内で使用されます。そこに独自のコーディングが必要な場合は、示されているようにパラメーターとして done メソッドに渡すことができます。追加のコーディングが必要ない場合は、関数を postaction に渡さないでください。次に、フォールバックとして定義された空のポストアクション関数が呼び出されます。

于 2012-08-01T14:05:47.913 に答える