绑定,应用和调用方法之间的区别?

时间:2013-03-14 08:37:14

标签: javascript

我在stackoverflow和web中搜索,无法获得正确的结果或解释这三种方法之间的区别。

据我了解,他们都在执行function/method in different context.

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

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

这是我对谷歌对象的正常功能。现在,当我在这里使用call和bind方法时,这里是输出。

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.

任何人都可以更多地启发我。

3 个答案:

答案 0 :(得分:13)

applycall是相同的,除了一个接受以参数形式传递给数组形式的函数的参数。

bindcallapply完全相同,具体取决于您使用的框架,但不会立即调用该函数,而是会返回一个新函数绑定到this的参数,当从新范围或上下文调用函数时,this仍将保留绑定到它的任何内容。绑定还允许您防止您的构造函数被攻击" applycall,因为它始终使用this的绑定参数,无论有人发送什么来尝试通过this或{{1}覆盖call }}

以下是一个例子:

apply

答案 1 :(得分: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

答案 2 :(得分:2)

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

讨论绑定方法,这是EcmaScript5中引入的新方法,尤其用于在调用objects方法时解析this范围。 this在异步方法调用中特别有用。