在javascript中将函数应用于对象

时间:2012-05-13 20:18:50

标签: javascript jquery function object

请原谅初学者的问题,但我很难绕过这个问题。使用jquery我可以做这样的事情:

$.each(array, testF); 

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

使用$ .each我可以将数组传递给函数testF,并访问数组每一行中包含的对象。但是,当我尝试做类似的事情时:

array[0].testF()

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

4 个答案:

答案 0 :(得分:4)

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

$.each()所做的等价物是testF.call(array[0], 0, array[0]),或者因为你不使用你可以简化的参数testF.call(array[0])

有关MDN的文档,请参阅.call()

答案 1 :(得分:2)

这样做:

testF.call( array[0] );

使用call函数方法可以设置函数调用的上下文(this值)。因此,只要您想要使用自定义上下文调用函数,而不是fn();,请执行fn.call( context );

答案 2 :(得分:1)

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

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

array[0].testF();

答案 3 :(得分:1)

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

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

但是,在大多数情况下,array[0]不会定义属性testF。如果你事先这样做的话:

array[0].testF = testF;

然后它会起作用。