2012-10-21 18 views
10

Attualmente sto implementando alcuni spessori per la bozza ES6. Mi chiedo se qualcuno possa dirmi cosa significa ReturnIfAbrupt. Per esempio, la mia implementazione per Number.toInt (che chiamate interne [[ToInteger]] è la seguente:.Che cosa significa ReturnIfAbrupt nella bozza ES6?

if (!('toInt' in Number)) 
    Object.defineProperty(Number, 'toInt', { 

     value: function toInt(value) { 
      // ECMA-262 Ed. 6, 9-27-12. 9.1.4 

      // 1. Let number be the result of calling ToNumber on the input argument. 
      var number = Number(value); 

      // 2. ReturnIfAbrupt(number). 
      // ? 

      // 3. If number is NaN, return +0. 
      if (number != number) return 0; 

      // 4. If number is +0, -0, +Infinity, or -Infinity, return number. 
      if (number == 0 || 1/number == 0) return number; 

      // 5. Return the result of computing sign(number) * floor(abs(number)). 
      return (n < 0 ? -1 : 1) * Math.floor(Math.abs(number)); 

     }, 

     writable: true, 
     configurable: true 

    }); 

Fase 2 è ReturnIfAbrupt(number) Noterete ho attualmente // ? per questo passo, perché io non sono sicuro di cosa fare cosa. significa quando si dice ReturnIfAbrupt(...)?

ho letto la sezione sulla ReturnIfAbrupt nel progetto, ma non riesco a capire cosa fare per la fase 2, cosa mettere al posto del // ? nel codice di cui sopra.

Dalla mia lettura, potrebbe essere che nulla dovrebbe essere fatto, e il passo ReturnIfAbrupt significa semplicemente lasciare che qualsiasi errore che si è verificato in ToNumber si propaghi, uscendo dalla funzione. Tuttavia, ciò sembra eccessivamente prolisso, come direi che potrebbe non dirlo. Inoltre, non mi sembra che lo ToNumber possa persino generare un errore. Qualcuno potrebbe confermare o aiutarmi a capire il vero significato?

+0

Ecco un punto di partenza: http: //people.mozilla .org/~ jorendorff/es6-draft.html # sec-8.8.4 –

+1

Sì, l'ho letto. Non ha senso per me, ma da quello che posso ricavarne, sembra che non ci sia davvero niente da fare su quel passo, e che se un errore è stato generato da 'ToNumber' nel passaggio 1 dovrebbe essere propagato e la funzione dovrebbe uscire. Tuttavia, non capisco davvero perché questo avrebbe bisogno del suo stesso passo, come dovrebbe essere capito. Se è così, vorrei una conferma. Se non è il caso, ho bisogno di aiuto per capire. –

+0

La tua interpretazione sembra giusta. Potrebbero esserci alcuni dettagli che mi mancano, ma la parte importante sarebbe restituire un'eccezione in caso di errore nel tipo di cover che immagino. –

risposta

6

ReturnIfAbrupt fa riferimento a un completamento brusco. Un record di completamento contiene un tipo e il valore associato ad esso. Un completamento normale sarebbe qualcosa come il valore risultante di un'espressione. Un completamento di ritorno da una funzione è il solito completamento previsto oltre a un normale completamento. Qualsiasi altro tipo di completamento è brusco. Questo è buttare, rompere, continuare.

if (isCompletionRecord(v)) { 
    if (isAbruptCompletion(v)) { 
    return v; 
    } else { 
    v = v.value; 
    } 
} 

Implementandolo come sei, ciò che comporterebbe è il wrapping della funzione in un tentativo di cattura. Un valore generato sarebbe un completamento brusco. Questo non è qualcosa che si vede a livello di JS, tuttavia, è per implementare il flusso di controllo e i trasferimenti di controllo non locali a livello del motore.

Ho implementato gran parte delle specifiche ES6 in una macchina virtuale JS che può anche aiutare a far luce su di esso, ecco ToInteger: https://github.com/Benvie/continuum/blob/master/lib/continuum.js#L516

function ToInteger(argument){ 
    if (argument && typeof argument === OBJECT && argument.IsCompletion) { 
    if (argument.IsAbruptCompletion) { 
     return argument; 
    } 
    argument = argument.value; 
    } 
    return ToNumber(argument) | 0; 
} 
+1

Grazie! Quindi per me, praticamente significa "non fare nulla". Mi sembra strano. Può 'ToNumber' portare a un completamento brusco? Non sembra così. –

+1

Inoltre, correggimi se sbaglio, ma dalla mia lettura della bozza che sto usando (9-27-12), penso che questo 'ToInteger' potrebbe non essere accurato al 100% a causa del' ToNumber (argomento) | 0' linea. Non darebbe sempre un numero finito? La bozza sembra indicare che 'ToInteger' può generare anche valori infiniti. –

+0

Significa non fare nulla a meno che tu non stia ricevendo un lancio. Pensa all'angolo di "non ci sono tentativi di cattura". Un modo per implementare try..catch è fare esattamente ciò che fa la specifica. Restituisci "getta" come i risultati normali, ma avvolto come un tipo "ThrownValue" e controlla sempre. La maggior parte delle volte non devi fare nulla. Ma se è il risultato speciale, è necessario passarlo senza modifiche. Alla cosa di ToInteger, infatti hai ragione.In un certo senso, alcuni degli operatori sono in attesa di un secondo passaggio per i dettagli. –