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

时间:2015-07-02 07:10:12

标签: javascript

我知道很多人已经使用过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()调用。

2 个答案:

答案 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;
&#13;
&#13;

ES6中,我们使用let