【问题标题】:How to get all arguments of a callback function如何获取回调函数的所有参数
【发布时间】:2012-04-07 09:24:56
【问题描述】:

很多时候,我发现自己在使用回调函数,但手边没有它的文档,很高兴看到所有要传递给该回调函数的参数。

// callback is a function that I don't know the args for...
// and lets say it was defined to be used like: callback(name, number, value)
something.doSomething( callback );

我如何确定它传递给它的参数是什么?

注意:当代码本身被混淆和缩小(就像许多 js 框架一样)时,查看源代码可能没有帮助

【问题讨论】:

标签: javascript callback arguments


【解决方案1】:

要在不破坏功能的情况下获取参数列表,请以这种方式覆盖回调函数:

var original = callback;
callback = function() {
    // Do something with arguments:
    console.log(arguments);
    return original.apply(this, arguments);
};
  1. 上下文 this 被保留。
  2. 所有参数均已正确传递。
  3. 返回值正确传递。

注意:这种方法在大多数情况下都有效。尽管存在这种方法会失败的极端情况,包括:

  • 只读属性(例如,使用 Object.definePropertywritable:false 定义)
  • 当 getter/setter 不对称时使用 getter/setter 定义的属性。
  • 主机对象和插件 API:例如Flash 和 ActiveX。

【讨论】:

  • 附言。如需更多详细信息,请将console.trace(); 添加到替换的回调函数中。
  • 为什么return original.apply(this, arguments); 还不够?
  • @RobW:如果您说的是以Note: Most browsers, including Chrome 14 and Internet Explorer 9... 开头的注释,它不适用于 Arguments 对象。我不知道有任何浏览器不接受 Arguments 对象作为.apply() 的第二个参数。 旁注,这是最近在 Chrome 中修复的,因此任何类似数组的对象都可以工作。
  • @amnotiam。 “关于 apply 的注释不 apply...” 人类语言的最佳表现。 :-)
  • @gdoron:确实。 :) 仅供参考,我刚刚在 IE6 中验证了这一点。 Arguments 对象被.apply() 接受,没有问题。
【解决方案2】:

可以这么简单吗

function callback() {
    console.log(arguments);
}

?

每个函数都提供在 automagic arguments 集合中调用它的参数。

【讨论】:

  • 他无法更改回调代码。如果可以,他就不需要使用论据来知道它的论据是什么……
  • 他在哪里说的?什么时候不能改JS代码了?除此之外,只需点击几下即可获得 JS 调试器和断点。
  • 他写他不想看函数的文档,所以肯定他手边没有那个函数代码......
  • 添加console.log(this),您就可以全面了解本地(est)范围。
  • 当您处理压缩/混淆代码时,这是一种常见的问题......就像任何 jquery/mootools/etc 一样
【解决方案3】:

这种车不就是牵马的吗?

你的函数需要一个回调。使用你的函数的方法应该知道回调应该接受哪些参数。

【讨论】:

  • 如果它是 my 函数,那将是正确的,但 +1 是为了更好地使用斜体。哈哈 ;)
【解决方案4】:

您甚至可以使用 [functionName].arguments 告诉它要获取哪个函数的参数:

(function(arg1, arg2, agr3){
    console.log('args are:', arguments);
    return function fn(){
        function m(){
            console.log(
                'fn.arguments:', fn.arguments,
                'm.arguments:', m.arguments,
                'argumentsX:', arguments
            );
        };
        m('mArg1', 'mArg2', 'mArg3', 'mArg4');
    };
})
(1, 2, Math.PI)  // invoke closure
('fnArg1', 'fnArg2', 'fnArg3', 'fnArg4');  // invoke "fn"

每个函数 def 都将 arguments 关键字重写为该范围 btw(如“argumentsX”日志所示)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 2017-12-25
    • 1970-01-01
    相关资源
    最近更新 更多