如何在JavaScript中退出调用函数?

时间:2013-03-28 09:52:17

标签: javascript language-features

可以从JavaScript中返回/退出调用函数吗?

我们正在向我们的框架添加测试方法,如果我们在Assertion上有错误,我们想退出。

鉴于以下简单的示例代码,我想交换EXIT_TEST_THAT_CALLED_ME,以便退出(相当于在测试中返回)方法Test123。

Assert = function ( expectedTrue, comment ) {
    if( ! expectedTrue ) {
      Log.Error( comment );
      EXIT_TEST_THAT_CALLED_ME;    
    }
}

Test123 ( ... ) {

  var inputField = getInputField(".input");
  Assert( (inputField !== null ), "Checking that we found an input field");

  inputField.doSomething();
  // This row will cause run time error if inputField is null  

}

我尝试了什么
return - 当然不起作用,因为它只从Assert方法返回 arguments.callee.caller.return - 什么都没有 arguments.callee.caller.return() - 没有方法'return'

注意
更改为已经具有此功能且一切都很好的测试框架不是一种选择。 :(

3 个答案:

答案 0 :(得分:2)

一种选择是使用try\catch\throw

Assert = function ( expectedTrue, comment ) {
    if( ! expectedTrue ) {
      Log.Error( comment );
      throw "OOPS";
    }
}

try{
  // function that users Assert
  Test123 ( ... )
}

catch(err){       
    alert(err);
    if (err=="OOPS"){
    //special handling for a certain exception
    }
}

使用此流程,在抛出异常的那一刻,它将向上传播,直到它到达catch块以便您处理异常。

此外,异常不限于字符串。它可以是整数,布尔值或对象。

答案 1 :(得分:1)

我认为不可能从函数中退出调用者。我建议一些解决方法:

1.使用Assert返回一个值,然后在来电者中执行return

Assert = function ( expectedTrue, comment ) {
            if( ! expectedTrue ) {
              Log.Error( comment );
              return false;    
            }
            return true;
        }    
Test123 ( ... ) {
        var assertResult = Assert( (inputField !== null ), "Checking that we found an input field");
        if (!assertResult)
            return;
        inputField.doSomething();
    }

2.在您的Assert

中发送回调函数
Assert = function ( expectedTrue, comment, success) {
            if( ! expectedTrue ) {
              Log.Error( comment );
              return;    
            }
            success();
         } 
assertSuccess = function () {
   inputField.doSomething();
}
Test123 ( ... ) {
    Assert( (inputField !== null ), "Checking that we found an input field", assertSuccess);
}

答案 2 :(得分:1)

无法改变调用者的执行流程,这是设计使然。

你能做的是:

  • 抛出异常。它会冒泡,直到它被赶到某处,迅速离开来电者。
  • 更改您的测试函数以进行条件返回,例如if (!assert(…)) return;