在JavaScript中将函数应用于对象

3

抱歉,我是一个初学者,但我对此感到困惑。使用jquery,我可以做到像这样:

$.each(array, testF); 

function testF(){
    console.log(this.name);  
}

使用$.each,我可以将数组传递给函数testF,并访问数组中每行包含的对象。但是当我尝试执行以下操作时:

array[0].testF()

我收到一个错误,指出对象没有'testF'方法。我想知道有人能否解释一下这里发生了什么......为什么jQuery可以工作,但第二个不能。再次请原谅初学者的问题。
4个回答

4
  • $.each(array, testF)会对数组中的每个元素调用testF(i, elem),并将this绑定到elem
  • array[0].testF()尝试调用array[0]上存在的方法testF()

$.each()所做的等同于testF.call(array[0], 0, array[0])或者由于您没有使用参数,可以简单地使用testF.call(array[0])

请参阅MDN以获取.call()的文档。


jQuery如何将this绑定到testF函数? - Derek 朕會功夫
2
它使用了JavaScript中每个函数都有的方法.call()。以下是从jQuery源代码中复制的语句:callback.call( object[ i ], i, object[ i++ ] ) - ThiefMaster

2

这样做:

testF.call( array[0] );
< p > call 函数方法使您能够设置函数调用的上下文(this 值)。因此,每当您想要使用自定义上下文调用函数时,而不是 fn();,请使用 fn.call( context );


1

这是因为对象数组[0]没有testF函数, 您需要先声明它。 像这样:

array[0].testF = function testF()
{
    console.log(this.name);
}

array[0].testF();

1

当你写下array[0].testF()时,这意味着:

  • 查找变量array
  • 取出索引为"0"的元素
  • 该元素中,取出索引为"testF"的元素
  • 并将其作为函数执行(同时将特殊变量this分配给array[0]

然而,在大多数情况下,array[0]不会定义属性testF。如果您事先这样做:

array[0].testF = testF;

那么它就能工作。


我会用“查找该元素的“testF”属性”来替换#3。 - ThiefMaster
@ThiefMaster:说得对;尽管JavaScript中的数组只是具有数字属性名称的特殊对象,但我的意思是展示它们之间的等价性。 - Amadan
我很感激逐步的解释。谢谢。 - bento

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接