2016-02-27 33 views
-1

我不知道這是可能的,但我有一些特殊情況需要它。在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()。

+0

不清楚你在問什麼。我不知道什麼「具有函數值的字符串的標籤」的意思。你想*使WHAT直接返回3在這裏*?你指的是哪個*第一個回報?你是什​​麼意思*動態生成代碼*?爲什麼會生成或執行諸如'return(return 3).v2()'之類的代碼? – 2016-02-27 03:33:37

+0

即使我不清楚你在問什麼。 –

+0

修改後,它生成爲'return this.v1()+2',這個語句是正確的,除非我們需要v1()直接返回,然後我試圖從當前函數的範圍中揭示v1()。 – user3352539

回答

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()。

我敢肯定,這可能規避執行的控制是v2具有當v1回報一些的情況,但這並不使它成爲一個很好的主意。考慮調試這些代碼會有多困難!

例如,您可能會在throw之間出現v2未捕獲的錯誤,並在上游捕獲它。這種可怕的濫用throw會比濫用goto更糟!不要以這樣不明確的方式修改代碼流;它使維護和調試成爲一場噩夢!

+0

嗨Seb,你寫的函數v2仍然不會因爲調用v1而返回。我是這樣說的,因爲我試圖讓它在返回3之前加2。 – user3352539