2015-05-18 15 views
19

Quello che voglio fare è usare quante più variabili immutabili possibile, riducendo così il numero di parti mobili nel mio codice. Voglio usare "var" e "let" solo quando è necessario.Come rendere costante il parametro della funzione in JavaScript?

Questo non funziona:

function constParam(const a){ 
    alert('You want me to '+a+'!'); 
} 

Tutte le idee?

risposta

21

I parametri di funzione rimarranno i collegamenti mutabili (come var) in ES6, non c'è niente che si possa fare contro questo. Probabilmente la soluzione migliore che si ottiene è quello di destrutturare il arguments object in un const inizializzazione:

function hasConstantParameters(const a, const b, const c, …) { // not possible 
    … 
}
function hasConstantParameters() { 
    const [a, b, c, …] = arguments; 
    … 
} 

Si noti che questa funzione avrà un arity diversa (.length), se avete bisogno che dovrete dichiarare una certa parametri segnaposto.

+6

Questa è in realtà una soluzione interessante per questo. Se non fosse così brutto, inizierei ad usarlo. –

+0

Come dire 'function hasConstantParameters (... args) {const [a, b] = args; }; '? –

+0

@BugsBunny Questo è praticamente lo stesso. Tuttavia, non mi piace l'introduzione di un altro identificatore ('args'), e non ho deliberatamente inserito alcun parametro nel solito posto, ma ho spostato tutto nella dichiarazione' const'. – Bergi

0

Non c'è modo di forzare un parametro a essere immutabile in JavaScript. Devi tenerne traccia da solo.

Basta scrivere in uno stile in cui non è necessario modificare le variabili. Il fatto che la lingua non fornisca servizi a forza a farlo non significa che non si possa ancora farlo comunque.

+0

C'è con ES6. –

+3

@QuentinRoy Riferimenti? Es6 fornisce modi per dichiarare valori costanti, ma non c'è modo di dichiarare un parametro * funzione * come costante. Puoi scrivere "function() {const a = ...; ...}", ma non puoi scrivere "function (const a) {...}". –

+0

Hai ragione mi dispiace di aver letto per digiunare. Pensavo che stavi parlando di variabili invece di parametri. –

-2

Prima di tutto, non ci sono costanti in JS (fino alla proposta ECMAScript 6). Dovrai usare var per costruire qualcosa del genere. Se si desidera avere aree "private" nel codice JS, si utilizza una delle funzionalità del linguaggio, che sono ambiti.

Così, per esempio, andare in questo modo:

var kindaConstant = function(){ 
    var donttouchthis 
    ... do something with it 
    return whateveryouvedonewithit 
} 

In questo caso donttouchthis non è così facilmente mutabile da "fuori".

+0

Le costanti esistono in javascript e sono supportate dai browser moderni: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const –

+0

Il tuo link inizia con le parole "Questo è una tecnologia sperimentale, "... È vero, alcune costanti del supporto del browser. Dovresti essere fortunato a lavorare per un progetto, che ti consente di scegliere il browser ... ;-) –

+0

Non è più sperimentale – Xenos

8

Non è possibile creare un parametro const. Usalo come valore iniziale di una variabile locale:

function constParam(a) { 
    const const_a = a; 
    ... 
} 

Si noti inoltre che const è supportata solo in Internet Explorer come di IE11. Vedere questo compatibility table

-1

Per strutture immutabili, credo che stiate cercando Immutable.js.


Come @Andreas_Gnyp sta dicendo, fino a quando non v'è alcuna ES6 let/const in JavaScript. (Né ci sarà function(const a) {...} dopo ES6 è completamente supportato.) Se si desidera utilizzare const, è possibile implementare la propria funzione const oppure iniziare a utilizzare la notazione ES6 con l'aiuto di alcuni componenti del compilatore ES6-to-ES5 di terze parti, ad esempio come Babel.

Tuttavia, tenere presente che const nella notazione ES6 non rende la variabile immutabile. Per esempio. const a = [1, 2]; a.push(3); è un programma completamente valido e a diventerà [1, 2, 3]. const sarà solo impediscono di riassegnazione a, in modo che non si può fare a = [] o a = {} o qualsiasi altra cosa, una volta const a = [1, 2]; già definito (in quel particolare campo di applicazione).

function hasConstantParameters(...args) { 
    const [a, b] = args; 
} 

Immutable.js farà in modo che, quando si definisce var a = fromJS([1, 2]); e passare a come un parametro di funzione, nella funzione di ricezione a.push(3) non influirà a. E 'questo quello che volevi ottenere?

+3

Questa risposta non ha nulla a che fare con la mia domanda. Ho chiesto dei parametri costanti, non della privacy dei membri della classe. – shal

+1

Vero, lascia che rielabori la mia risposta. –

1

Questo è quello che faccio:

Invece di:

function F(const a, const b, const c, const d, const e, const f, const g){ // Invalid Code 
    // lorem 
    // ipsum 
} 

..Use:

function F(){const[a, b, c, d, e, f, g] = arguments; 
    // lorem 
    // ipsum 
} 
+1

Questa è solo la risposta di Bergi senza la spiegazione. – faintsignal

0
function wrapper(i){ 
    const C=i 
    return new Function("a","b", "return a+b+"+C)  
} 

f100 = wrapper(100) //ƒ anonymous(a,b/*``*/) {return a+b+100} 
f100(1,2) //OUTPUT 103 

f200 = wrapper(200) //ƒ anonymous(a,b/*``*/) {return a+b+200} 
f200(1,2) //OUTPUT 203 
Problemi correlati