我在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.
任何人都可以更多地启发我。
答案 0 :(得分:13)
apply
和call
是相同的,除了一个接受以参数形式传递给数组形式的函数的参数。
bind
与call
或apply
完全相同,具体取决于您使用的框架,但不会立即调用该函数,而是会返回一个新函数绑定到this
的参数,当从新范围或上下文调用函数时,this
仍将保留绑定到它的任何内容。绑定还允许您防止您的构造函数被攻击" apply
或call
,因为它始终使用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
在异步方法调用中特别有用。