2014-12-05 20 views
11

questo snip sarà eseguito senza alcun lamentano su entrambi nodejs e il browser:è javascript "return" veramente una * parola chiave *?

this.return = function (x) { 
    return x 
}; 

console.log (this.return(1)); 

mi aspettavo che a fallire duro con un errore di sintassi.

Intendevo, posso capire perché this['return'] funziona .. ma ho sempre pensato che return fosse una parola chiave lexer?

javascript è un linguaggio sensibile al contesto?

aggiunto: il punto è che il lexer non ha un token T_RETURN, ma utilizza invece un T_STRING. non lo è?

+0

È possibile sovrascrivere troppo indefinito. Non significa che sia una buona idea! Modifica: tecnicamente non stai sovrascrivendo il rendimento. –

+0

Non so nulla degli interpreti, ma per me è solo "logico" che dopo un tale '.', tutto ciò che può essere analizzato come un identificatore è valido. –

+0

È una parola chiave riservata, ma può essere utilizzata come proprietà senza che si verifichi un errore, è solo una pessima idea farlo. – adeneo

risposta

1

Sì, il ritorno è una parola chiave. Hai definito una proprietà ed essenzialmente hai usato una stringa chiamata return. Avevi effettivamente utilizzato ritorno avrebbe causato un errore

var return = "error";//Uncaught SyntaxError: Unexpected token return

+0

Stai parlando di "define", che avviene davvero molto più tardi nel processo. Lexer -> Scanner -> Parser. Mi aspettavo che aumentasse un errore a livello di scanner. – eridal

10

return è un reserved keyword, ma parole chiave riservate può essere usato come un property accessors senza alcun problema, è solo generalmente cattiva pratica di farlo.

parole chiave riservate non possono specificamente essere utilizzati come nomi di variabili, funzioni, metodi o identificatori per gli array e gli oggetti, perché ECMAScript specifica il comportamento speciale per loro:

Il testo di partenza da script ECMAScript viene sottoposto a scansione da sinistra a corretto e viene convertito in una sequenza di elementi di input che sono token, caratteri di controllo, terminatori di riga, commenti o spazi bianchi.

ECMAScript definisce anche determinate parole chiave e valori letterali e dispone di regole per l'inserimento automatico del punto e virgola alle istruzioni finali.

Le parole riservate in realtà si applicano solo agli identificatori (rispetto a IdentifierNames).
Come descritto in ES5, questi sono tutti IdentifierNames che non escludono le parole riservate.

a.return 
a["return"] 
a = { return: "test" }. 

Tuttavia questi non sono

function return() {} 
var return; 

More on MDN

+0

Mi sono imbattuto in qualcosa di simile prima. Sebbene tecnicamente possibile, è considerata una cattiva idea utilizzare parole chiave riservate perché rende il tuo codice difficile da leggere e capire in seguito. – FlyingPiMonster

+2

@ kittycat3141: Direi che è una cattiva pratica perché a) le persone potrebbero non esserne abituate (il che potrebbe essere quello a cui ti riferisci) eb) il codice non viene eseguito nelle versioni precedenti di IE8. Tuttavia, a) si spera che cambino una volta rilasciato ES6 (che definisce 'Map # delete'). –

+0

@FelixKling - ed è facile confondersi, un minuto stai facendo 'foo [" return "]', il prossimo stai facendo 'foo [return]' e non riesci a capire perché non funzionerà. Inoltre alcuni software di minification e/o IDE possono avere problemi quando improvvisamente vedono 'return' dove non gli appartiene, specialmente se fai cose come' foo.return' – adeneo