in PHP abbiamo il use
parola chiave ordinata per consentire l'utilizzo di variabili 'esterne' quando si utilizzano le chiusure, come la seguente:Chiusure: Equivalente di PHP "uso" parola chiave o un elenco di acquisizione C++ in Javascript o una lingua transpiler
$tax = 10;
$totalPrice = function ($quantity, $price) use ($tax){ //mandatory 'use'
return ($price * $quantity) * ($tax + 1.0);
};
Se omettiamo la parte use ($tax)
, si genera un errore, che mi piace molto.
Allo stesso modo in C++ 11, noi facciamo lo stesso, specificando le variabili esterne, chiamato capture list, con staffe:
float tax = 10;
auto totalPrice = [tax](int quantity, float price){ //mandatory []
return (price*quantity) * (tax + 1.0);
};
Come in PHP, esso genera un errore se la lista di cattura viene omesso.
in JavaScript, che non hanno un equivalente a questo use
parola chiave (o C++ []), dobbiamo solo fare:
var tax = 10;
var totalPrice = function (quantity, price){ //no need for 'use' or similar
return (price * quantity) * (tax + 1.0); //tax is usable here :(
};
non mi piace molto che la libertà, preferisco fortemente specificare le variabili che saranno accessibili dalla funzione di chiusura o otterranno un errore in altro modo, per ragioni che esulano dall'ambito di questa domanda.
Quindi, mi chiedevo, c'è una parola chiave o un operatore speciale per questo in ES6, o in qualsiasi lingua che traspone in javascript? (CoffeeScript, TypeScript, ecc.) In tal caso, in quale lingua e qual è la sintassi?
Idealmente mi piacerebbe rilevare in tempo di transpilation (o prima), quando una variabile non è stata esplicitamente 'autorizzata' per essere utilizzata in una chiusura, proprio come PHP/C++.
Grazie in anticipo
PS: Per favore non mi chiedono perché voglio che questo in un linguaggio JS-come, che il dibattito è un altro argomento.
EDIT: Un linter che esegue questo controllo aiuterebbe anche
__Perché si desidera questo in JS? __ – Rayon
Non penso che ci sia un traspiatore che potrebbe farlo. Dovrebbe gestire l'ambito di queste funzioni e questo potrebbe benissimo infrangere il codice. Sarebbe un affare molto schizzinoso. Penso che la cosa migliore sarebbe avere un linter che ti avvisa delle tue attuali chiusure. – MinusFour
@MinusFour un linter o simili sarebbe fantastico, ne sai uno che controlla questo caso particolare? –