我们可以调用()或apply()方法而不是事件处理程序的bind()。
我知道在使用事件处理程序时我们可以使用nnind()来传递上下文。
var user = {
data : [{name:"first person wood" , age : 45},{name :"Edwards" , age:34}],
click : function(event){
var randomNumber = ((Math.random() * 2 | 0) + 1) -1;
$('input').val(this.data[randomNumber].name + " ,"
+ this.data[randomNumber].age);
}
};
$('button').click(user.click.bind(user));
在上面的示例中,我们使用bind在单击按钮时传递用户上下文。我们可以使用call()或apply()来做同样的事情吗? 如果是的话,我们将如何实现它?
答案 0 :(得分:2)
我们可以使用call()或apply()来做同样的事情吗?
你可以做一些类似的,但你仍然需要创建一个函数(这是bind
所做的):
$('button').click(function() {
return user.click.apply(user, arguments);
});
(为清楚起见:上面的arguments
是JavaScript arguments
伪变量,它在函数内部可用,并且是该函数调用的参数的伪数组。像这样使用apply
然后用这些参数调用函数。)
与bind
相比,这个缺点是上面的函数维护了对它创建的上下文的引用(它在该上下文上是closure),而后者又引用了所有的变量在该上下文中(函数是否使用它们)。所以从理论上讲,如果你有一些变量指向那个上下文中的大型和临时的东西,那么创建一个函数会保留那个大而临时的东西,否则它可能有资格进行垃圾收集(因为,同样,函数引用了上下文,引用大的临时事物)。如果任何副作用都是不可观察的,那么允许发动机对其进行优化,因此有些可能和其他人可能没有。使用bind
表示问题没有出现。它更简单。
答案 1 :(得分:1)
没有
您必须将功能传递给click
。
bind
创建一个新函数(在调用时调用具有特定上下文的另一个函数)。
apply
和call
一个函数(具有特定的上下文)立即。