在Javascript中,是否可以从内部函数中停止外部函数执行?

时间:2015-10-19 01:18:05

标签: javascript

是否有可能从其内部函数中突破外部函数?

(function one(){
    var foo = (function two(){
        if(true){
            return true; //all good
        }else{
            //how can we break function one here?
    })();
    //extra statements only executed if foo is true
})();

没有"返回"对? :P

更新

全部谢谢 - 因为我怀疑"返回"我一直在寻找的功能是不可能的。但是根据您的输入/提示,我重新编写了代码并使用了try / catch块。在JS中有很多方法可以给猫皮肤!

4 个答案:

答案 0 :(得分:3)

return仅适用于其使用的函数。

你可以做的是让two()返回一个布尔值 而不是评估two()

if语句中的one()

function two() {

  // Some logic here...
  var isError = true; // sometimes is false :)
  
  // Internals
  if (isError) {
    console.log("Something is wrong");
  }
  
  // Finally return a boolean
  return isError;
}


(function one(){

  // `two()` returns a boolean, true if there's an error.
  // `return` will stop furthere execution of `one()` 
  if( two() ) return; 
  
  console.log("This will not log if there was an error")

})();

答案 1 :(得分:1)

在您的示例代码中,外部函数最好测试foo,但在更复杂的代码中,异常可能是合适的:

;(function() {
  var foo = (function() { return true })()
  if (!foo) return;
  console.log('reached because foo was true')
})()

;(function() {
  try {
    ;(function() {
      var foo = (function() { throw new Error('fail') })()
      /* only reached if an error wasn't thrown */
    })()
  }
  catch (error) {
    console.log('Something went wrong: ' + error)
  }
})()

输出:

reached because foo was true
Something went wrong: Error: fail

这种愿望在JavaScript中可能比在类似语言中更常见,因为JavaScript提供范围的唯一方法是使用函数体,并且跨越函数边界的控制流选项更少。但是如果你纯粹使用一个自执行函数来提供一个范围,而不是保持函数来关闭变量,那么当你遇到控制流时,就不会那样做像这样的情况。

答案 2 :(得分:0)

  

//我们怎么能在这里打破第一个功能?

返回false



var div = document.querySelector("div");
var buttons = document.querySelectorAll("button");

var process = function process(value) {
  return (function one(val) {
    var foo = (function two(bool) {
      if (bool) {
        return true; //all good
      } else {
        return false //how can we break function one here?        
      }
    })(val);
    //extra statements only executed if foo is true
    // if `foo` : `true` do stuff
    if (foo) alert(foo);
    // return `foo`
    return foo    
  })(value)
};

var fn = function(e) {
  div.innerHTML = process(e.target.textContent === "false" ? false : true);
}

buttons[0].onclick = fn;
buttons[1].onclick = fn;

<button>true</button>
<button>false</button>
<div></div>
&#13;
&#13;
&#13;

答案 3 :(得分:0)

函数的一般概念是它将返回它所驻留的单个函数的数据类型。返回只是一种语言功能,用于实现从函数中返回数据的想法。因此,无法应用执行 return-return 的概念。

但在这个范例中,您解决的问题与控制流更相关。您选择的解决方案应该基于您在代码中最清晰地表达想法的方式。

根据您提出此问题的原因,如果您在应用程序中受到某个逻辑的挑战,并且不仅仅询问有关该语言的技术问题,我建议您发布一个代码示例,让我们了解您的目标的意图。因为这是选择最佳解决方案的关键因素。

当然,您可以通过各种方式实施解决方案。例外,有状态或功能性解决方案。但是你需要为这份工作选择合适的工具。