2016-02-27 4 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(), что-то вроде псевдокода this.return(3) для v2(), и, конечно, ничто не может быть достигнуто после первого возврата.

Если я генерирую код динамически и он должен быть возвратом во второй функции. (Таким образом, можно легко получить неожиданный маркер для return (return 3).v2(), при попытке получить внутреннюю функцию, чтобы назвать себя, как это часть текущей функции.)

Есть в любом случае, чтобы сделать this.v1() непосредственно вызвать вне функции v2() вернуться, для первое возвращение, которое он встречает? Предпочтительно, путем фокусировки на модификации v1().

+0

Непонятно, что вы просите. Я не знаю, что означает «тег String со значением функции». Вы хотите * сделать WHAT напрямую возвращением 3 здесь *? Который * первый возврат * вы имеете в виду? Что вы подразумеваете под * генерированием кода динамически *? Почему код, такой как 'return (return 3) .v2()' когда-либо генерируется или выполняется? –

+0

Даже я не понимаю, о чем вы спрашиваете. –

+0

Изменено, оно сгенерировано как 'return this.v1() +2', это утверждение верно, если нам не нужно v1(), чтобы вызвать прямой возврат, то я попытался выявить v1() из области текущей функции. – user3352539

ответ

1

Есть ли способ сделать это.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

Смежные вопросы