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

标签 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;
        $('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/

相关文章:

javascript - 如何创建一个处理程序,该处理程序将返回列表元素 'ID' Clicked 的 'LI'

javascript - AngularJS 将模块注入(inject)父模块并使用子模块运行和配置 block

javascript - 如何更改元素的 CSS 类并在单击时删除所有其他类

javascript - 选择 html 元素 1,2,5,6 ...元素数量未知的优雅方法/

javascript - 如何在golang中顺序处理并发请求?

javascript - 元素不会附加到容器

javascript - Express.js session 在不同网络上的不同机器上的用户之间持续存在?

javascript - Typescript嵌套函数包装返回类型问题

javascript - 如何根据数据更改线条颜色 - Chartist 或 Chart.js

javascript - 单击 slidetoggle div 以打开幻灯片