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的掌握者;-)