箭功能...
正如我相信大家都知道,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