web-dev-qa-db-ja.com

JavaScriptで関数パラメーターを定数にする方法は?

私がやりたいのは、できるだけ多くの不変変数を使用して、コード内の可動部分の数を減らすことです。 「var」と「let」は必要なときにだけ使いたいです。

これは機能しません:

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

何か案は?

33
shal

ES6では、関数パラメーターは可変バインディング(varなど)のままになりますが、それに対してできることは何もありません。おそらくあなたが得る最良の解決策は、arguments初期化で constオブジェクト を非構造化することです:

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

この関数は異なるアリティ(.length)、必要な場合は、プレースホルダーパラメーターを宣言する必要があります。

39
Bergi

パラメーターconstを作成することはできません。ローカル変数の初期値として使用します:

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

constはIE11の時点でInternet Explorerでのみサポートされていることにも注意してください。こちらをご覧ください 互換性テーブル

14
Barmar

JavaScriptでパラメーターを強制的に不変にする方法はありません。あなた自身でそれを追跡する必要があります。

変数を変更しないスタイルで書くだけです。言語がforceに機能を提供しないという事実は、とにかくまだそれができないという意味ではありません。

1

これが私がすることです:

の代わりに:

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

..使用する:

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

ES6の構造化を使用して、paramsから定数を作成できます

function test(...args) {
   const [a, b, c] = args;
}
1
Drenai

不変の構造については、あなたが探していると思います Immutable.js


@Andreas_Gnypが言っているように、ES6までJavaScriptにはlet/constはありません。 (または、ES6が完全にサポートされるとfunction(const a) {...}はありません。)constを使用する場合は、独自のconst機能を実装するか、使用を開始できます。 Babel など、サードパーティのES6-to-ES5コンパイラを使用したES6表記。

ただし、ES6表記のconstしないを使用すると、変数は不変になります。例えば。 const a = [1, 2]; a.Push(3);は完全に有効なプログラムであり、aは_[1, 2, 3]_になります。 constonlyaの再割り当てを禁止するため、_a = []_または_a = {}_を一度も実行できません_const a = [1, 2];_は既に定義されています(その特定のスコープ内)。

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

Immutable.js は、var a = fromJS([1, 2]);を定義し、aを関数パラメーターとして渡すときに、受信関数a.Push(3)aには影響しません。これはあなたが達成したかったものですか?

1
Bugs Bunny
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