Javascript:call(),apply()而不是bind()方法

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

我们可以为事件处理程序调用()或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()来做同样的事情吗? 如果是,我们将如何实现它

您必须将函数传递给
单击

bind
创建一个新函数(当调用另一个函数时,该函数使用特定上下文调用该函数)

立即应用
调用
函数(具有特定上下文)

我们可以使用call()或apply()来做同样的事情吗

您可以执行类似的操作,但仍然需要创建一个函数(这就是
bind
所做的):

(为了清楚起见:上面的
参数
是JavaScript
参数
伪变量,它在函数内部可用,是该函数调用的伪参数数组。然后使用类似的
apply
调用具有这些参数的函数。)

bind
相比,这种方法的缺点是上面的函数维护了对创建它的上下文的引用(它是对该上下文的引用),而该上下文又引用了该上下文中的所有变量(无论函数是否使用它们)。因此,从理论上讲,如果您有一些变量指向该上下文中的某个大型临时对象,那么创建一个函数会保留该大型临时对象,而它本来可能有资格进行垃圾收集(因为,同样,该函数引用了上下文,而上下文引用了大型临时对象)。发动机可以优化这一点,前提是任何副作用都是不可观察的,因此有些可能会,有些可能不会。使用
bind
意味着这个问题不会出现。而且更简单

$('button').click(function() {
    return user.click.apply(user, arguments);
});