2016-12-26 62 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」的屬性的對象,則會出現該錯誤。

張貼在你的問題的工作代碼調用回調函數正確的方法,因爲你已經注意到了。所述callback參數的值是要調用的功能,從而使代碼使用.call()list[n]值來調用函數作爲要被用於this的值。

這將是一個真正可怕的想法寫這樣的代碼,但它會工作(除了是它是一個可怕的想法的原因可能出現的問題):

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

這是因爲列表是一個陣列,並使用。帶有列表的運算符表示該回調是一個對象,但回調作爲參數傳遞。

callback.call()是正確的,因爲調用方法在Javascript中實現所有功能的存在。它允許你調用這些函數。

+0

謝謝Codesingh。 – Sabuncu

+0

歡迎兄弟:) – Codesingh

相關問題