È possibile simulare costanti in Javascript usando le chiusure?
-
05-07-2019 - |
Domanda
È possibile simulare costanti in Javascript usando le chiusure? Se è così, puoi fornirmi un esempio?
Soluzione
Firefox e Chrome supportano entrambi const
parola chiave. IE no. Quindi, se hai bisogno di costanti e non hai bisogno di supportare IE, const
non è una cattiva scelta. Tuttavia, nessuno dei due browser produce un errore di runtime quando un valore viene assegnato a una const
; i valori rimangono semplicemente invariati.
Altrimenti, è necessario utilizzare le funzioni per definire le costanti che non possono essere modificate:
function PI() { return 3.14159; }
var area = radius*radius * PI();
Ovviamente, potresti semplicemente scrivere codice che non modifica mai determinate variabili e forse stabilire uno schema di denominazione per tali variabili in modo tale da riconoscere che non dovranno mai essere modificate ...
// note to self: never assign values to variables utilizing all-uppercase name
var PI = 3.14159;
Un'altra opzione per " simulare " le costanti dovrebbero usare la funzionalità di definizione della proprietà disponibile in alcuni browser per definire proprietà di sola lettura su un oggetto. Naturalmente, poiché i browser che supportano le definizioni delle proprietà non includono IE, ciò non aiuta davvero ... (nota che IE 8 supporta le definizioni delle proprietà dopo una moda ... ma non su oggetti JavaScript)
Infine, negli scenari molto forzati potresti usare argomenti di funzione come costanti (forse questo è quello che stavi pensando quando hai suggerito chiusure?). Mentre si comportano come variabili, rimangono nell'ambito della funzione in cui sono definiti e non possono quindi influenzare i valori detenuti da variabili con lo stesso nome al di fuori della funzione in cui sono modificati:
var blah = 3;
var naw = "nope";
(function(blah, naw)
{
blah = 2;
naw = "yeah";
alert(naw + blah); // "yeah2"
})(blah, naw);
alert(naw + blah); // "nope3"
Nota che qualcosa di simile a questo è comunemente usato dai plugin jQuery , ma per la ragione opposta: il codice jQuery viene solitamente scritto usando la scorciatoia $
per fare riferimento all'oggetto jQuery, ma la libreria è destinata a continuare a funzionare anche se qualche altro codice ridefinisce quel simbolo; avvolgendo il codice della libreria e del plugin in funzioni anonime con un parametro $
e quindi passando jQuery
come argomento, il codice viene isolato dalle modifiche che altre librerie potrebbero apportare al valore di $
in seguito.
Vedi anche: Ci sono costanti in Javascript?
Altri suggerimenti
Puoi creare costanti denominate di sola lettura con la const parola chiave ( Implementato in JavaScript 1.5 ).
Questo è quanto ho ottenuto:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript">
function Scope()
{
return function()
{
return {Constant: 1}; //Object literal
};
}
var Scope = Scope();
</script>
</head>
<body>
<script type="text/javascript">
document.write(Scope().Constant + "<br />");
//The following line of code has no effect and fails silently.
Scope().Constant = 6;
document.write(Scope().Constant + "<br />");
</script>
</body>
</html>
Questo approccio mi consente di estendere l'ambito per avere più di una variabile membro costante estendendo letteralmente l'oggetto.
Per dichiarare:
function globals(){
const x1="something";
const x2="otherthing";
return{
getX1=function(){
return x1;
},
getX2=function(){
return x2;
}
}
}
var globalConstants=globals();
Per accedere:
globalConstants.getX1();