在Javascript中返回外部函数的函数

时间:2016-02-27 03:11:12

标签: javascript

我不知道这是可能的,但我有一些特殊情况需要它。

//Obj is a class with nothing.
Obj.prototype.v1 = function(){
    //this is a normal statement.
    //it could be something else
    return 3;
}
//or it can be any way to declare a function: 
var v1 = function(){return 3};

Obj.prototype.v2 = function(){
    return this.v1()+2;
}

如何直接在这里返回3?这就像函数v1()类似于v2()的伪代码this.return(3),当然在第一次返回后无法到达。

如果我动态生成代码,则必须在第二个函数中返回。 (所以它很容易得到return (return 3).v2()的意外标记,同时试图让内部函数被调用,就像它是当前函数的一部分一样。)

有没有让this.v1()直接导致外部函数v2()返回,它遇到的第一次返回?优选地,通过关注修改v1()。

1 个答案:

答案 0 :(得分:1)

  

无论如何使this.v1()直接导致外部函数v2()返回,它遇到的第一次返回?

惯用解决方案是在v2中表达这种逻辑。例如,您可以让v1修改决定v2执行操作的标记:

Obj.prototype.v1 = function(){
    this.v1.continue = true;  /* XXX: Continue? */
    this.v1.continue = false; /* ...  or not?   */
    return 3;
}

Obj.prototype.v2 = function(){
    var ret_val = this.v1()+2;
    if (!this.v1.continue) {
        return;
    }
    /* XXX: Insert more code here */
}

我们在这里讨论相当基本的JavaScript。你有一本书吗?

  

优选通过关注修改v1()。

我确信在{em>某些情况下v2返回v1时,throw可以规避执行的控制权,但这并不是&# 39;这是一个好主意。想想调试这段代码会有多困难!

例如,您可以v2 throw无法捕获的错误,并进一步向上游捕获。对goto的这种可怕的滥用会比滥用java.lang.IllegalArgumentException: Invalid <url-pattern> SolrServlet1 in servlet mapping 更糟糕!不要以这种不明确的方式修改你的代码流;它使维护和调试成为一场噩梦!