更好地理解 JavaScript 中的回调函数

我理解将一个函数作为回调函数传递给另一个函数并让它执行,但我不理解这样做的最佳实现。我在寻找一个非常基本的例子,像这样:

var myCallBackExample = {
myFirstFunction : function( param1, param2, callback ) {
// Do something with param1 and param2.
if ( arguments.length == 3 ) {
// Execute callback function.
// What is the "best" way to do this?
}
},
mySecondFunction : function() {
myFirstFunction( false, true, function() {
// When this anonymous function is called, execute it.
});
}
};

在 myFirstfunction 中,如果我返回了 new callback () ,那么它就会工作并执行匿名函数,但是对我来说,这似乎不是正确的方法。

208575 次浏览

回调是关于信号的,而“ new”是关于创建对象实例的。

在这种情况下,仅执行“ callback () ;”比执行“ return new callback ()”更为合适,因为您无论如何都不会使用返回值执行任何操作。

(而 arguments.length = = 3测试确实很笨拙,fwiw,最好检查回调参数是否存在并且是一个函数。)

你可以直接说

callback();

另外,如果要在回调中调整 this的值,也可以使用 call方法。

callback.call( newValueForThis);

函数中的 this就是 newValueForThis

执行一个函数有三种主要的可能性:

var callback = function(x, y) {
// "this" may be different depending how you call the function
alert(this);
};
  1. 回调(参数 _ 1,参数 _ 2) ;
  2. Call (some _ object,argen _ 1,argen _ 2) ;
  3. Callback.apply (some _ object,[ argument _ 1,argument _ 2]) ;

你选择的方法取决于:

  1. 将参数存储在 Array 中或作为不同的变量。
  2. 您需要在某个对象的上下文中调用该函数。在这种情况下,在该回调中使用“ this”关键字将引用 call ()或 application ()中作为参数传递的对象。如果不希望传递对象上下文,请使用 null 或未定义的。在后一种情况下,全局对象将用于“ this”。

函数调用的文件, 功能,应用

适当的执行方法包括:

if( callback ) callback();

这使得回调参数是可选的。。

您应该检查回调函数是否存在,是否为可执行函数:

if (callback && typeof(callback) === "function") {
// execute the callback, passing parameters as necessary
callback();
}

许多库(jQuery、 dojo 等)对其异步函数使用类似的模式,对所有异步函数使用 node.js (nodejs 通常将 errordata传递给回调函数)。查查他们的源代码会有帮助!

function checkCallback(cb) {
if (cb || cb != '') {
if (typeof window[cb] === 'undefined') alert('Callback function not found.');
else window[cb].call(this, Arg1, Arg2);
}
}

下面是一个用 JavaScript 解释 callback()函数的基本例子:

var x = 0;


function testCallBack(param1, param2, callback) {
alert('param1= ' + param1 + ', param2= ' + param2 + ' X=' + x);
if (callback && typeof(callback) === "function") {
x += 1;
alert("Calla Back x= " + x);
x += 1;
callback();
}
}


testCallBack('ham', 'cheese', function() {
alert("Function X= " + x);
});

JSFiddle

你可使用:

if (callback && typeof(callback) === "function") {
callback();
}

下面的例子比较全面:

function mySandwich(param1, param2, callback) {
alert('Started eating my sandwich.\n\nIt has: ' + param1 + ', ' + param2);
var sandwich = {
toppings: [param1, param2]
},
madeCorrectly = (typeof(param1) === "string" && typeof(param2) === "string") ? true : false;
if (callback && typeof(callback) === "function") {
callback.apply(sandwich, [madeCorrectly]);
}
}


mySandwich('ham', 'cheese', function(correct) {
if (correct) {
alert("Finished eating my " + this.toppings[0] + " and " + this.toppings[1] + " sandwich.");
} else {
alert("Gross!  Why would I eat a " + this.toppings[0] + " and " + this.toppings[1] + " sandwich?");
}
});