我有一个JavaScript函数,它接受一个函数作为参数,如下所示:
var myFunction = function(funParameter) {
// funParameter is a function
};
我可以这样调用这个函数:
myFunction(function (aParameter, anotherOne) {
// do stuff
});
在myFunction
的正文中,如何检索funParameter
应该接收的参数?我想知道传递给myFunction
的函数声明的参数(在上面的例子中,我想知道参数函数接受aParameter
和anotherOne
。
我知道这样做的唯一方法就是适当地解析funParameter.toString()
,但我觉得这有点像hacky。
应该像摩卡测试一样:
it('should test something synchronously', function () {...});
it('should test something asynchronously', function (done) {
// test...
done();
});
如果传递给it
的函数接受done
参数,则必须能够以不同的方式行事。
答案 0 :(得分:3)
你想要的是这个。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/length
除非参数名称保证在整个代码中保持一致并且永远不会以任何方式进行调整,否则您不希望检查参数是否已命名,“完成”,大多数情况下,开发人员应该可以自由命名他们的功能参数。
此外,javascript代码(用于浏览器)通常被修改和修改,并缩短参数名称。如果名称被更改,它将破坏你的功能。
但是,您更愿意做的是确定函数指定的参数数量,并且可以由Function.length
完成。
然而,这也不是一个可靠的解决方案,因为您始终无法指定任何内容,仍然可以使用arguments
获取参数值。
在JavaScript中,假设某些东西按照我的预期方式工作通常是个坏主意。因为你永远不知道谁会用他们的代码做什么。
语言本身在很多方面都非常动态,在设计函数/ API之前必须非常小心。
来自MDN的:
console.log( (function () {}).length ); /* 0 */
console.log( (function (a) {}).length ); /* 1 */
console.log( (function (a, b) {}).length ); /* 2 etc. */
console.log( (function (...args) {}).length ); /* 0, rest parameter is not counted */
答案 1 :(得分:1)
如果您正在寻找Mocha的具体方式,请查看source code。
我挖了一下,发现Mocha只是检查传递函数的length属性,就像你在source file中看到的那样。然后,他们检查async属性,如下所示。如果async为true,则以不同的方式调用测试函数来处理测试函数的异步性质。
this.async = fn && fn.length
答案 2 :(得分:0)
按Function.prototype.toString
获取函数参数确实很棘手。到目前为止,尽管不符合规范,但我所测试的所有浏览器都非常支持它,并且AngularJS使用它来按照无序参数名称映射所请求的控制器功能。
function myFunction(func) {
var params = func.toString()
.match(/function\s*.*\((.+)\)/)[1]
.split(',');
return params; // ['aParameter', 'anotherOne']
}
*来自'functools'
的来源