Javascript:call(),apply()而不是bind()方法
我们可以为事件处理程序调用()或apply()方法,而不是bind() 我知道在使用事件处理程序时,可以使用nbind()在上下文中传递Javascript:call(),apply()而不是bind()方法,javascript,Javascript,我们可以为事件处理程序调用()或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
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()来做同样的事情吗?
如果是,我们将如何实现它
您必须将函数传递给单击
bind
创建一个新函数(当调用另一个函数时,该函数使用特定上下文调用该函数)
立即应用
和调用
函数(具有特定上下文)
我们可以使用call()或apply()来做同样的事情吗
您可以执行类似的操作,但仍然需要创建一个函数(这就是bind
所做的):
(为了清楚起见:上面的参数
是JavaScript参数
伪变量,它在函数内部可用,是该函数调用的伪参数数组。然后使用类似的apply
调用具有这些参数的函数。)
与bind
相比,这种方法的缺点是上面的函数维护了对创建它的上下文的引用(它是对该上下文的引用),而该上下文又引用了该上下文中的所有变量(无论函数是否使用它们)。因此,从理论上讲,如果您有一些变量指向该上下文中的某个大型临时对象,那么创建一个函数会保留该大型临时对象,而它本来可能有资格进行垃圾收集(因为,同样,该函数引用了上下文,而上下文引用了大型临时对象)。发动机可以优化这一点,前提是任何副作用都是不可观察的,因此有些可能会,有些可能不会。使用bind
意味着这个问题不会出现。而且更简单
$('button').click(function() {
return user.click.apply(user, arguments);
});