如何在javascript中终止父函数执行?

时间:2013-06-29 19:15:21

标签: javascript closures evaluation

我需要覆盖函数的某些行为,在调用其他函数之后。问题是这个父函数是一个库,我不想改变它,所以像make一些标志或者这个函数的另一个变化的解决方案并不是那么好。我知道我在函数中有一个调用者对象,我可以改变,所以也许我可以用它来弄清楚smth。以下是例子:

function parent()
{
  console.log("some need stuff");
  some.handler.function.from.config.that.i.can.change();
  console.log("need omit this right till the end");
}

function child()
{
  console.log("need to somehow stop evaluation of " + child.caller + " function");
}

作为一个红宝石程序员,我知道有一些lambdas,你可以用它来终止内部关闭范围的评估。但我不知道如何从javascript中做到这一点。

3 个答案:

答案 0 :(得分:6)

你不能直接这样做。 (此外.caller已过时)

然而,您可以使用肮脏的技巧:

try{
    parentFunction();//calls child
}catch(e){
   //done
}

function child(){
    doWhatever();
    throw new Error("this will hopefully propagate");
}

Fiddle

这只会在假设父母在调用孩子时没有捕获异常时才会起作用。

此外,使用异常进行流量控制通常是个坏主意。使用它作为最后的手段。

答案 1 :(得分:0)

在调用库之前调用一个你控制的新函数,并将调用包装到try / catch块中无法修改的库中。

例如:

function meta-parent()
{
  try {
    parent();
  }
  catch (e){
      // don't really be empty!
  }
}

function parent()
{
  console.log("some need stuff");
  some.handler.function.from.config.that.i.can.change();
  // Nothing below here will run because of your child's exception
  console.log("need omit this right till the end");  
}

function child()
{
  console.log("need to somehow stop evaluation of " + child.caller + " function");
  throw new Error(); //breakout!
}

注意灵感:Breaking a parent function from within a child function (PHP Preferrably)

答案 2 :(得分:0)

正如Benjamin Gruenbaum所指出的那样,流量控制的例外情况应该被视为最后的手段,但Promises / A提案(在某些实现中)是否不会以这种方式使这种例外的利用合法化?

我确实认为,从子函数抛出的(否则未被捕获的)错误可能不是Promises / A作者的想法(即我们仍然可以说是“肮脏的伎俩”),但是承诺/提案也没有明确排除此类错误传播。

Q lib对于这个问题是理想的,允许这样的事情:

Q.fcall(parentFunction).then(function (value) {
    alert(value);
}, function (error) {
    alert(error);
});

<强> fiddle

请注意,为方便起见,我还在小提琴中使用jQuery,但仅为按钮提供功能。