如何检测函数是否具有return语句

时间:2014-07-10 01:18:39

标签: javascript

我正在为javascript编写一个断言库。我希望断言是可链接的,因此每个断言都需要调用

return this;

以便可以在其上运行更多断言。

我想要做的是编写一个测试,检查每个断言是否都有return语句。我可以想到两个解决方案,我不确定我喜欢它们中的任何一个。

  1. 有问题的解决方案 - 在我的测试中,我可以调用每个断言,看看它是否返回一个值。这是有问题的,因为我不知道断言是成功返回还是抛出断言错误。理想情况下,我会在循环中调用所有断言,因此我可以用相同的方式调用它们。

  2. Hacky解决方案 - 我可以在每个断言上调用.toString()并使用正则表达式在函数体中查找字符串return this。我认为这可以很好地工作,因为我可以解释正则表达式中的任何数量的空白,但是这并不会因为将字符串放在一个无法访问的代码分支(例如if(!true) return this)而试图解决该解决方案。

  3. 我认为#2可能更简单,但我不喜欢它。有没有人有其他解决方案?

    编辑:我想如何编写这些测试的示例代码:

    var assertionFns = getAssertionFns(); // actual generation process not relevant
    
    assertionFns.forEach(function(fn){
        test(fnReturnsAValue(fn));
    });
    
    function fnReturnsAValue(fn){
        // What goes here?
    }
    
    function test(value){
        if(!value){
            // fail the test
        }
    }
    

    重申为什么#1有问题,如果断言失败,fn将抛出AssertionError,假设我实际执行了该函数。

    我希望这澄清一下,如果没有,请告诉我。

1 个答案:

答案 0 :(得分:0)

如果检查它是否未返回undefined怎么样?如果函数只是说

return;

然后是,它仍将返回undefined。但是如果函数有

return false;

在其中(或任何其他值 - 包括对象,数字等),然后以下测试将确定函数是否有返回

function fnReturnsAValue(fn){
    if (typeof(fn)=="function" && typeof(fn())!="undefined") { return true; }
    return false;
}