为什么JavaScript中的bind方法无效

16

函数:

function talk(){ 
        console.log(this.name + " dice: ");
}

var Person = function(name, surname){
    this.name = name;
    this.surname = surname;
}

var p = new Person("Mark", "Red");

talk.bind(p);

绑定出了什么问题?


值得补充的是,对于跟进这个问题的任何人来说,你可以通过使用函数的 callapply 方法来实现“一次性”绑定。因此,另一个解决上述问题的方法是将 .bind 替换为 .call(这里是 talk.call(p))。 - Platinum Azure
5个回答

31

它是有效的,talk.bind(p)返回绑定函数:

talk.bind(p)();


8

bind() 没有问题——只是没有正确使用。 bind() 返回一个新函数,该函数绑定到指定的对象。您仍然需要执行该函数:

function talk(){ 
        console.log(this.name + " dice: ");
}

var Person = function(name, surname){
    this.name = name;
    this.surname = surname;
}

var p = new Person("Mark", "Red");

var markTalks = talk.bind(p);

markTalks();    // logs properly

2

使用bind没有问题,它返回一个绑定到传递参数对象的函数。因此,您需要像这样调用它:

talk.bind(p)();

1
正如其他人所提到的,bind似乎按预期工作,但需要调用。
另一个解决方案更加简洁,特别是如果每个“Person”对象都需要说话的能力,那么可以在person构造函数中包含该函数。
var Person = function(name, surname){
    this.name = name;
    this.surname = surname;
    this.talk = function(){
        console.log(this.name + " dice: ");
    }
}

var p = new Person("Mark", "Red");

p.talk();

请查看这个fiddle: http://jsfiddle.net/amspianist/J5BSh/


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接