我有一个使用大量回调的JavaScript应用程序。一个典型的函数将进行回调,并用另一个回调包装它。
Namespace.foo = function( arg, their_on_success ) {
var my_on_success = function( result ) {
console.log( 'my_on_success() called' );
if( 'function' === typeof their_on_success ) {
their_on_success( result );
}
}
something( arg, my_on_success );
};
鉴于上面的示例,何时应该使用本地call()
方法(将结果var作为第二个参数传递)而不是调用their_on_success()
并通过函数调用传递结果? / p>
答案 0 :(得分:19)
call()用于更改函数的 this 值:
var obj = {a: 0};
method.call(obj, "parameter");
function method(para) {
this.a == 0; // true <-- obj is now this
}
答案 1 :(得分:7)
答案 2 :(得分:3)
使用函数的call()
方法允许您在函数执行期间将绑定到函数的对象更改为this
- 这也称为 context < / p>
their_on_success.call(myContext, results)
但是,如果您的回调函数不依赖于this
,那么您调用它的方式没有区别。
答案 3 :(得分:3)
一个很好的例子是在实现需要回调的函数时。在编写OO代码时,您希望允许调用者指定将调用回调的上下文。
function validateFormAjax(form, callback, context) {
// Using jQuery for simplicity
$.ajax({
url: '/validateForm.php',
data: getFormData(form),
success: function(data) {
callback.call(context, data);
}
});
}
请注意,我的示例可以通过将context参数传递给$.ajax
调用来实现,但这对于使用call
答案 4 :(得分:1)
使用call()的另一种情况是,当您处于一个您无法信任该对象的环境中时,您自己的方法还没有被替换,或者您知道它实际上并没有有你想要在它上面运行的方法。 hasOwnProperty通常是这样一种方法 - 有很多地方javascript对象可能没有自己的hasOwnProperty方法,所以调用它作为hasOwnProperty.call(obj,propertyName)是谨慎的。
答案 5 :(得分:0)
我经常使用“调用”的一种情况是拼接参数:
const fn = function() {
const args = Array.prototype.slice.call(arguments, 0);
console.log(args);
}
请注意,参数是一个对象。 args是一个数组。