我需要覆盖函数的某些行为,在调用其他函数之后。问题是这个父函数是一个库,我不想改变它,所以像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中做到这一点。
答案 0 :(得分:6)
你不能直接这样做。 (此外.caller
已过时)
然而,您可以使用肮脏的技巧:
try{
parentFunction();//calls child
}catch(e){
//done
}
function child(){
doWhatever();
throw new Error("this will hopefully propagate");
}
这只会在假设父母在调用孩子时没有捕获异常时才会起作用。
此外,使用异常进行流量控制通常是个坏主意。使用它作为最后的手段。
答案 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,但仅为按钮提供功能。