箭功能...
正如我相信大家都知道,javascript
支持arrow functions这是真正的简洁但遗憾的是不与您的整齐regex
工作。
我很快将您的好regex
转换为它自己的function
,它将function
作为输入,并返回它是否为空,以便稍后简化。只是为了演示如何箭头功能,可广泛的应用,我把它放在一个:
isEmpty = f => /^function[^{]+\{\s*\}/m.test(f.toString())
现在,我们可以很容易地测试一个空函数:
function eF() {}
这正如我们期望与isEmpty(eF)
回报true
。
,最后再用一个实际的功能:
function retOne() {return 1;}
其预期与isEmpty(retOne)
回报false
一次。
不过,我遇到的问题是带箭头的功能,所以要重新初始化空单,我们有原来的更短的语法:
eF =() => {}
和'stringified'
版,那是一个很大的不同前:
"() => {}"
所以当然在这种情况下,呼叫isEmpty(eF)
回报false
当我们想要true
。我不确定是否需要测试是否所有功能(即包括arrow functions
)都是空的,但如果你这样做,你的regex
将需要修改...
我不是很擅长自己写,但已尝试夫妇和一个进一步的事情,你可能要考虑的是documentation的arrow functions
尤其是这部分的宽松性质:
(param1, param2, …, paramN) => { statements }
(param1, param2, …, paramN) => expression
// equivalent to: (param1, param2, …, paramN) => { return expression; }
// Parentheses are optional when there's only one parameter name:
(singleParam) => { statements }
singleParam => { statements }
这说明大括号{...}
如何并不总是必要的。所以这个功能:
retOne =() => 1
是valid
并可以使形成新的regex
更加困难。我想到的一个解决方法是从f.toString()
删除所有大括号使用:
str.replace(/[{}]/g, '')
。
然后从那里使用regex test
。
希望这是有帮助的考虑,如果你想要arrow functions
也能够被测试。
有趣的问题...... – 2010-12-03 13:57:07
JS反射的概念让我笑,但作为的问题;你已经处理了空白和多行,所以afaik这个效果很好。 – annakata 2010-12-03 13:58:59
不要忘记寻找所有评论的方法体(如果这是你的规范) – Brad 2010-12-03 14:01:44