对于事件处理程序,我们可以调用()或apply()方法来代替bind()吗?
我知道我们可以在使用事件处理程序时使用nbind() 来传递上下文。
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() 来做同样的事情吗? 如果是,我们将如何实现它?
最佳答案
can we use the call() or the apply() to do the same ?
您可以做一些类似的事情,但您仍然必须创建一个函数(这就是bind
所做的):
$('button').click(function() {
return user.click.apply(user, arguments);
});
(为了清楚起见:上面的 arguments
是 JavaScript arguments
伪变量,它在函数内部可用,并且是参数的伪数组调用该函数。像这样使用 apply
然后使用这些参数调用该函数。)
与 bind
相比,其缺点是上面的函数维护了对其创建所在上下文的引用(它是该上下文上的 closure),而该引用又引用了所有该上下文中的变量(无论函数是否使用它们)。因此,从理论上讲,如果您有某个变量指向该上下文中的大型临时对象,则创建一个函数会将该大型临时对象保留在周围,否则它可能有资格进行垃圾回收(因为该函数再次引用了上下文,它引用了大的临时事物)。如果任何副作用都是不可观察到的,则允许引擎对此进行优化,因此有些可以,有些则不能。使用 bind
意味着不会出现该问题。而且更简单。
关于Javascript : call() , apply() 而不是 bind() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23107769/