修改回调函数的参数数-javascript
我知道你们中的许多人已经使用了JavaScript UI小部件插件等等。。。它提供回调函数。例如,我们有修改回调函数的参数数-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
对象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将参数前置到函数。