Comment rendre le paramètre de fonction constant en JavaScript?

Ce que je veux faire est d'utiliser autant de variables immuables que possible, réduisant ainsi le nombre de pièces mobiles dans mon code. Je veux utiliser "var" et "laisser" seulement quand c'est nécessaire.

Cela ne fonctionnera pas:

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

Des idées?

23
demandé sur Damjan Pavlica 2015-05-19 02:36:24

7 réponses

Les paramètres de la fonction resteront des liaisons mutables (comme var) dans ES6, il n'y a rien que vous puissiez faire contre cela. Probablement la meilleure solution que vous obtenez est de déstructurer le arguments objet dans une initialisation const:

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

Notez que cette fonction aura une arité différente (.length), Si vous en avez besoin, vous devrez déclarer certains paramètres d'espace réservé.

29
répondu Bergi 2015-07-31 11:54:56

Vous ne pouvez pas créer de paramètre const. L'utiliser comme valeur initiale d'une variable locale:

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

Notez également que const n'est pris en charge que dans Internet Explorer depuis IE11. Voir ce tableau de compatibilité

10
répondu Barmar 2015-05-18 23:44:50

C'est ce que je fais:

Au Lieu de:

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

..Utilisation:

function F(){const[a, b, c, d, e, f, g] = arguments;
    // lorem
    // ipsum
}
1
répondu Pacerier 2017-04-02 21:51:00

Il N'y a aucun moyen de forcer un paramètre à être immuable en JavaScript. Vous devez garder une trace de cela vous-même.

Écrivez simplement dans un style où vous ne mutez pas les variables. Le fait que la langue ne vous offre aucune facilité pour vous forcer à le faire ne signifie pas que vous ne pouvez toujours pas le faire de toute façon.

0
répondu Logan R. Kearsley 2015-05-18 23:40:53
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
0
répondu sergey andriyaka 2018-02-21 13:24:04

Pour les structures immuables, je crois que vous recherchez immuable.js .


Comme le dit @Andreas_Gnyp, JUSQU'à ES6 il n'y a pas let / const en JavaScript. (Il n'y aura pas non plus function(const a) {...} Une fois ES6 sorti et entièrement pris en charge.) Si vous voulez utiliser const, Vous pouvez soit implémenter votre propre fonctionnalité const, soit commencer à utiliser la notation ES6 avec l'aide d'un compilateur ES6-to-ES5 tiers, tel que Babel.

Cependant, gardez à l'esprit que const dans ES6 la notation ne rend pas la variable immuable. Par exemple const a = [1, 2]; a.push(3); est un programme complètement valide et {[8] } deviendra [1, 2, 3]. const seulement vous empêchera de réaffecter a, de sorte que vous ne pouvez pas faire a = [] ou {[13] } ou autre chose une fois const a = [1, 2]; déjà défini (dans cette portée particulière).

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

Immuable.js sera assurez-vous que, lorsque vous définissez var a = fromJS([1, 2]); et passer a comme paramètre d'une fonction, la fonction de réception a.push(3) n'affectera pas a. Est-ce que que tu voulais faire?

-1
répondu Bugs Bunny 2017-06-27 09:13:05

Tout d'abord, il n'y a pas de constantes dans JS (jusqu'à la proposition ECMAScript 6). Vous devrez utiliser var pour construire quelque chose comme ça. Si vous voulez avoir des zones "privées" dans votre code JS, vous utilisez l'une des fonctionnalités du langage, qui sont des étendues.

Donc, par exemple, allez comme ceci:

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

Dans ce cas, donttouchthis n'est pas facilement mutables "de l'extérieur".

-2
répondu Andreas Gnyp 2015-05-19 00:16:31