2016-12-26 63 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

相关问题