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

时间:2014-04-16 11:13:39

标签: javascript

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

2 个答案:

答案 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 创建一个新函数(在调用时调用具有特定上下文的另一个函数)。

applycall一个函数(具有特定的上下文)立即