2016-12-26 4 views
-1

このコードは動作します:配列項目の関数呼び出しで、関数ではないというエラーが発生するのはなぜですか?

function forEach (list, callback) { 
    for (var n = 0; n < list.length; n++) { 
    callback.call(list[n], n); 
    } 
} 

次のことを行いません。

function forEach (list, callback) { 
    for (var n = 0; n < list.length; n++) { 
    list[n].callback(n); // Uncaught TypeError: 
          // list[n].callback is not a function 
    } 
} 

注:いずれの場合も、callbackはそうのように、一つの引数を持つ無名関数を渡されます。

forEach(array, function(index) { 
    // log to console... 
}); 
+1

'list [n]'は 'callback'プロパティを持つオブジェクトではないためです。 – Barmar

+0

@Barmarありがとうございます。 – Sabuncu

答えて

2

JavaScriptが文章を理解しています

list[n].callback(n); 
意味として

  • オブジェクトの "コールバック" という名前のプロパティを取得list[n]
  • を取得
  • はあなたのリストがないためn

を渡し、関数とその値を呼び出しますフェッチ"コールバック"という名前のプロパティを持つオブジェクトを含んでいない場合、そのエラーが発生します。

あなたの質問に投稿された作業コードは、気づいたとおり、コールバック関数を呼び出す正しい方法です。 callbackパラメータの値が呼び出される関数であるため、に使用される値としてlist[n]の値を持つ関数を呼び出すコードでは、.call()が使用されます。

このようなコードを書くために本当にひどいアイデアだろうが、それは(それがひどいアイデアされた理由です可能性のある問題を除く)に働くだろう:

function forEach (list, callback) { 
    for (var n = 0; n < list.length; n++) { 
    list[n].callback = callback; // <-- TERRIBLE IDEA - DO NOT DO 
    list[n].callback(n); 
    } 
} 

また、は残念なバグを引き起こす可能性が高いため、を実行しませんが、リスト内の各オブジェクトに「コールバック」というプロパティの値を明示的に与えるため機能します。

+0

詳細な説明をお待ちしております。 – Sabuncu

1

これは、リストが配列であるためです。 operator with listは、コールバックがオブジェクトであることを示しますが、コールバックはパラメータとして渡されます。

callメソッドがJavascriptのすべての関数に存在するため、callback.call()は正しいです。それはあなたが関数を呼び出すことができます。

+0

Codesinghありがとうございます。 – Sabuncu

+0

歓迎兄弟:) – Codesingh

関連する問題