12

我在 stackoverflow 和网络上搜索,无法得到正确的结果或解释这三种方法之间的位置差异。

据我了解,他们都执行相同的操作function/method in different context.

var google = {  
    makeBeer : function(arg1,arg2){     
         alert([arg1, arg2]);        
    }    
}

google.makeBeer('water','soda');

这是我的google对象的正常功能。现在,当我在这里使用调用和绑定方法时,这是输出。

var google = {
    makeBeer: function (arg1, arg2) {
        alert([arg1, arg2]);
    }
}

google.makeBeer('water', 'soda');

function yahoo() {}

var yah = new yahoo();
google.makeBeer.call(yah, 'pepsi', 'coke');

function msn() {

}

var msn = new msn();
google.makeBeer.call(msn, 'sprite', 'limca');

我仍然没有看到这样做的目的,我可以继续打电话给google.makeBeer three times with different arguments.

任何人都可以在这方面给我更多启发。

4

3 回答 3

13

apply并且call是相同的东西,除了一个接受要以数组形式传递给函数的参数,另一个接受参数形式。

bind与您使用的框架执行相同的操作callapply根据您使用的框架执行相同的操作,但不会立即调用该函数,而是返回一个绑定了您的参数的新函数,this并且当从新范围或上下文调用该函数时,this仍将保持不变你绑定到它。绑定还允许您防止您的构造函数被applyor “黑客”,call因为this无论有人发送什么试图this通过callor覆盖它,它都将始终使用绑定的参数apply

这是一个例子:

function Profile(u) {
    this.user = u;
    this.getUser = function () {
        return this.user;
    };
}

function Profile2(u) {
    this.user = u;
    this.getUser = (function () {
        return this.user;
    });
}

function Profile3(u) {
    this.user = u;
    this.getUser = (function () {
        return this.user;
    });
}

var x = new Profile('guest');
var x2 = new Profile2('guest');
var x3 = new Profile3('guest');

alert(x.getUser.apply({
    user: 'Vinoth'
})); // Vinoth
alert(x2.getUser.call({
    user: 'Babu'
})); // babu
alert(x3.getUser.bind(x3).call({
    user: 'Nandan'
})); // Guest
于 2013-03-14T12:58:04.077 回答
3

bind创建一个具有相同函数体的新函数,然后返回新函数
call在不同的传递上下文中调用相同的函数,并且必须显式编写参数 在不同的传递上下文中 apply调用相同的函数,但参数必须在数组

var f = function(p1, p2) {
    var s = this;
}

var newFunc = f.bind(window, 1, 2);
// here newFunc is a function which when you will call will have this as window and p1 = 1 and p2 = 2

f.call(window, 1, 2);
// by executing this line this = window p1 = 1 and p2 = 2

f.call(document, 2, 3);
// by executing this line this = document p1 = 2 and p2 = 3

f.apply(window, [1, 2]);
// by executing this line this = window p1 = 1 and p2 = 2
于 2013-03-14T08:43:35.867 回答
2

简单地说 apply() 和 call() 之间没有区别,唯一不同的是您传递的参数。在 apply() 中,您必须将参数作为数组传递,而在 call() 方法中,您以逗号分隔的形式传递参数.

说到 bind 方法,这是 EcmaScript5 中引入的新方法,专门用于this在调用 objects 方法时解析作用域。this在异步方法调用中特别有用。

于 2013-03-14T08:45:53.457 回答