Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
修改回调函数的参数数-javascript_Javascript - Fatal编程技术网

修改回调函数的参数数-javascript

修改回调函数的参数数-javascript,javascript,Javascript,我知道你们中的许多人已经使用了JavaScript UI小部件插件等等。。。它提供回调函数。例如,我们有对象x,它有一个函数,比如说.doThisAfterAnEvent()。根据Object x的官方文档,该函数接受带有一个参数的function()类型的单个参数,比如\u args 要可视化,以下是示例: var handler = function(_args) { // Do something. } var x = $("#element-to-widget-ify").tr

我知道你们中的许多人已经使用了JavaScript UI小部件插件等等。。。它提供回调函数。例如,我们有
对象x
,它有一个函数,比如说
.doThisAfterAnEvent()
。根据
Object x
的官方文档,该函数接受带有一个参数的
function()
类型的单个参数,比如
\u args

要可视化,以下是示例:

var handler = function(_args) {
    // Do something.
}

var x = $("#element-to-widget-ify").transform()
x.doThisAfterAnEvent(handler)
我的问题是,如何修改方法
.doThisAfterAnEvent()
,以接受具有两个或多个参数而不是一个参数的函数?在这种情况下,我需要向
处理程序
函数传递第二个额外值


编辑:

var widgets = {
    "widget-at-the-nav": $("#nav-widget").transform(),
    "widget-at-the-footer": $("#nav-footer").transform(),
    "widget-at-the-search": $("#nav-search").transform(),
    length: 3
}

var handler = function(_args, _option) {
    console.log("key in: " + _option
    // Other processes...
}

for(key in widgets) {
    console.log("key outer: " + key)
    widget[key].doThisAfterAnEvent(function(json) {
        console.log("key out: " + key)
        handler(json, key)
    })
}
这是我的尝试。但它的打印方式如下:

key outer: widget-at-the-nav
key outer: widget-at-the-footer
key outer: widget-at-the-search
key out: widget-at-the-nav
key in: widget-at-the-nav
key out: widget-at-the-nav
key in: widget-at-the-nav
key out: widget-at-the-nav
key in: widget-at-the-nav

我忘了告诉你们函数
.doThisAfterAnEvent()
(不是
handler()
函数)内部有一个
AJAX
调用。

如果你们问这个问题,我想你们的意思是在调用doThisAfterAnEvent的那一刻,你们已经知道处理程序的一个参数超过两个

在这种情况下,解决方案是在匿名函数中使用两个参数包装处理程序,该匿名函数只接受一个参数,然后回调处理程序:

x.doThisAfterAnEvent(function(_arg) { handler(myKnownArg, _arg) });

这个问题一团糟,所以我只想谈谈最近的编辑,以及它包含的代码

你用匿名函数屏蔽处理程序的方法非常正确,只是你的循环弄乱了你的词法范围。AJAX位是一个非常重要的细节,因为任何AJAX调用都很可能在循环后很长时间内运行,这意味着这些回调函数都将引用相同的
键的最终值

您需要创建一个新的作用域,其中键是“锁定的”,以便引用是正确的

函数Con(){}
Con.prototype.doThisAfterAnEvent=函数(fn){
//伪造一些AJAX编程
setTimeout(函数(){
fn.呼叫(本);
}, 1500);
};
$.fn.transform=函数(){
返回新Con();
};
变量窗口小部件={
“导航小部件”:$(“#导航小部件”).transform(),
“页脚小部件”:$(“#导航页脚”).transform(),
“搜索时的小部件”:$(“#导航搜索”).transform()
};
变量处理程序=函数(_参数,_选项){
log(“输入:”+_选项);
//其他过程。。。
};
for(在小部件中输入var键){
控制台日志(“外键:+键);
(功能(键){
//使用IIFE建立新的词汇范围
widgets[key].doThisAfterAnEvent(函数(json){
控制台日志(“键出:+键);
处理程序(json,key);
});
}(关键);
}

为什么需要第二个参数?您不能仅使用对象(如
{param1:value1,param2:value2}
)作为唯一参数吗?您需要在doThisAfterAnEvent中更改此参数,函数在其中调用回调。您可以发布与doThisAfterAnEvent等效的内容吗?@RayToal函数
。doThisAfterAnEvent()
创建一个
对象
,在内部传递给处理程序,我无法修改该对象。@RemyGrandin查看我的编辑。或者您可以使用设置写入的上下文(
this
),也可以使用bind将参数前置到函数。