Javascript 将回调函数作为参数传递
我正在调用下面这样的函数。这里我还传递了回调函数,该函数应该只在特定表单提交之后调用,而不是在此之前调用Javascript 将回调函数作为参数传递,javascript,Javascript,我正在调用下面这样的函数。这里我还传递了回调函数,该函数应该只在特定表单提交之后调用,而不是在此之前调用 <div onClick="myNamespace.openDialog(par1,par2,myNamespace.callback(myNamespace.cb,'p1','p2'))">OPEN DIALOG</div> var myNamespace = myNamespace || {}; myNamespace={ return{
<div onClick="myNamespace.openDialog(par1,par2,myNamespace.callback(myNamespace.cb,'p1','p2'))">OPEN DIALOG</div>
var myNamespace = myNamespace || {};
myNamespace={
return{
cb:function(p1,p2){alert(p1+" cb "+p2);},
callback:function(f){f(arguments[1],arguments[2]);},
openDialog:function(p1,p2,f){
// aboutBizzNs.cb should be called here only after form submit
}
}
}();
打开对话框
var myNamespace=myNamespace | |{};
myNamespace={
返回{
cb:函数(p1,p2){alert(p1+“cb”+p2);},
回调:函数(f){f(参数[1],参数[2]);},
openDialog:函数(p1、p2、f){
//aboutBizzNs.cb只能在表单提交后在此处调用
}
}
}();
问题是
警报(p1+“cb”+p2)单击打开对话框
后,会调用code>。不应该是这样。它应该只在我想叫的时候叫。问题是什么问题是aboutBizzNs.callback
会立即调用作为参数提供的函数
与以下内容进行比较,创建并返回一个函数,该函数将在调用iself时调用提供的函数:
callback: function(f){
// The f variable is bound in a closure below, which is returned immediately.
// However, the f function is NOT invoked yet.
// We also copy the arguments of this function invocation and expose
// them via a variable which is also bound in the following closure.
var boundArgs = Array.prototype.slice(arguments, 0);
return function () {
// Now f is invoked when this inner function is evaluated, which
// should be in response to the event.
return f(boundArgs[1], boundArgs[2]);}
}
}
我还将使用,如以下所示,可以使用任意数量的“绑定”参数
return function () {
return f.apply(this, boundArgs.slice(1));
}
。。但这是一个相当常见的操作,并且已经得到了(它是ES5的一部分,可在其他浏览器中使用)。因此,原件
myNamespace.callback(myNamespace.cb,'p1','p2')
。。可以写成
myNamespace.cb.bind(this,'p1','p2')
。。同样的效果。不同之处在于回调(cb
)函数中的this
可能会有所不同,因为bind
不允许this
的“传递”
或者,忘记所有这些特殊函数,简单地包装回调函数
function () { myNamespace.cb('p1','p2') }
在查看了您的参数和详细信息后,我发现将function(){myNamespace.cb('p1','p2')}
作为参数传递给openDialog(…,f)
,然后在openDialog()
内部调用f()
就足够了。谢谢you@Manish不客气!闭包(以及作为一级值的函数)的掌握有点棘手,但一旦掌握了闭包,就成了JavaScript的掌握者;-)