我理解将一个函数传递给另一个函数作为回调并让它执行,但我不理解这样做的最佳实现.我正在寻找一个非常基本的例子,像这样:
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中,如果我确实返回了新的callback(),那么它可以工作并执行匿名函数,但这对我来说似乎不是正确的方法.
你可以说
callback();
或者,call
如果要调整this
回调中的值,可以使用该方法.
callback.call( newValueForThis);
函数内部this
将是任何东西newValueForThis
.
您应该检查回调是否存在,并且是可执行函数:
if (callback && typeof(callback) === "function") { // execute the callback, passing parameters as necessary callback(); }
许多库(jQuery的,道场等)的使用为他们的异步函数类似的模式,以及用于node.js的所有异步函数(通常的NodeJS传递error
和data
回调).查看他们的源代码会有所帮助!
执行函数有三种主要可能性:
var callback = function(x, y) { // "this" may be different depending how you call the function alert(this); };
回调(argument_1,argument_2);
callback.call(some_object,argument_1,argument_2);
callback.apply(some_object,[argument_1,argument_2]);
您选择的方法取决于:
您将参数存储在Array中或作为不同的变量.
您想在某个对象的上下文中调用该函数.在这种情况下,在该回调中使用"this"关键字将引用在call()或apply()中作为参数传递的对象.如果您不想传递对象上下文,请使用null或undefined.在后一种情况下,全局对象将用于"this".
Function.call, Function.apply的文档
回调是关于信号的,而"新"是关于创建对象实例.
在这种情况下,执行"callback();"会更合适.比"返回新的回调()"因为你没有做任何带有返回值的事情.
(并且arguments.length == 3测试真的很笨重,fwiw,更好地检查回调参数是否存在并且是一个函数.)
适当的实施将是:
if( callback ) callback();
这使得回调参数可选..