我知道很多人已经使用过JavaScript UI小部件插件等...它提供了回调函数。例如,我们有Object x
并且它有一个函数,比如.doThisAfterAnEvent()
。根据{{1}}的官方文档,该函数接受带有一个参数的Object x
类型的单个参数,比如function()
。
要想象,这是一个例子:
_args
我的问题是,如何修改方法var handler = function(_args) {
// Do something.
}
var x = $("#element-to-widget-ify").transform()
x.doThisAfterAnEvent(handler)
以接受带有两个或更多参数的函数 而不是一个?在这种情况下,我需要将第二个额外值传递给.doThisAfterAnEvent()
函数。
修改
handler
这是我的尝试。但它的打印方式如下:
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()
调用。
答案 0 :(得分:0)
如果你这么想,我想你的意思是在你调用doThisAfterAnEvent时,你已经知道你的处理程序有两个参数。
在这种情况下,解决方案是在一个匿名函数中用两个参数包装你的处理程序,该函数只接受一个参数,然后回调你的处理程序:
x.doThisAfterAnEvent(function(_arg) { handler(myKnownArg, _arg) });
答案 1 :(得分:0)
这个问题很乱,所以我只会触及最近的编辑及其包含的代码。
使用匿名函数屏蔽处理程序的方法非常正确,只是因为你的循环弄乱了你的词法范围。 AJAX位是一个非常重要的细节,因为任何AJAX调用很可能在你循环后很长时间内运行,这意味着那些回调函数都会引用key
的相同最终值。
您需要创建一个新的范围,其中密钥被锁定在'中,以便引用正确。
function Con () {}
Con.prototype.doThisAfterAnEvent = function (fn) {
// Fake some AJAX programming
window.setTimeout(function () {
fn.call(this);
}, 1500);
};
$.fn.transform = function () {
return new Con();
};
var widgets = {
"widget-at-the-nav": $("#nav-widget").transform(),
"widget-at-the-footer": $("#nav-footer").transform(),
"widget-at-the-search": $("#nav-search").transform()
};
var handler = function(_args, _option) {
console.log("key in: " + _option);
// Other processes...
};
for (var key in widgets) {
console.log("key outer: " + key);
(function (key) {
// Use an IIFE to establish a new lexical scope
widgets[key].doThisAfterAnEvent(function(json) {
console.log("key out: " + key);
handler(json, key);
});
}(key));
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
&#13;
在ES6
中,我们使用let
。