关于ecmascript 6:如何在JavaScript中使函数参数不变?

How to make function parameter constant in JavaScript?

我要做的是使用尽可能多的不可变变量,从而减少代码中移动部件的数量。我只想在必要时使用"var"和"let"。

这行不通:

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

有什么想法吗?


函数参数将保持ES6中的可变绑定(如var),您对此无能为力。可能您得到的最佳解决方案是在const初始化中销毁arguments对象:

1
2
3
function hasConstantParameters(<s>const a, const b, const c,</s>) { // not possible
    …
}

1
2
3
4
function hasConstantParameters() {
    const [a, b, c,] = arguments;
    …
}

请注意,如果需要,此函数将具有不同的arity(.length),您必须声明一些占位符参数。


不能设置参数const。将其用作局部变量的初始值:

1
2
3
4
function constParam(a) {
    const const_a = a;
    ...
}

还请注意,只有从IE11起,Internet Explorer才支持const。请参阅此兼容性表


我们可以使用ES6析构函数从参数创建常量

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


我就是这样做的:

而不是:

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

使用:

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


在JavaScript中,无法强制参数不可变。你必须自己跟踪。

只需以一种您碰巧不会改变变量的样式编写。事实上,语言并没有提供任何工具来强迫你这样做并不意味着你仍然不能这样做。


对于不可变结构,我相信您正在寻找不可变的.js。

正如@andreas_gnyp所说,在ES6之前,javascript中没有let/const。(也不会在ES6退出并完全支持后出现function(const a) {...})如果您想使用const,您可以实现自己的const功能,或者在一些第三方ES6-to-ES5编译器(如babel)的帮助下开始使用ES6符号。

但是,记住ES6符号中的const不会使变量不可变。例如,const a = [1, 2]; a.push(3);是一个完全有效的程序,a将成为[1, 2, 3]const只会阻止您重新分配a,这样您就不能执行a = []a = {}或任何已定义(在该特定范围内)的const a = [1, 2];操作。

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

immutable.js将确保在定义var a = fromJS([1, 2]);并将a作为函数参数传递时,接收函数a.push(3)中的a不会受到影响。这就是你想要达到的目标吗?


1
2
3
4
5
6
7
8
9
10
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

首先,JS中没有常量(直到ECMAScript 6提案)。你必须用var来构造类似的东西。如果您希望在JS代码中有"私有"区域,那么可以使用该语言的一个特性,即作用域。

例如,这样做:

1
2
3
4
5
 var kindaConstant = function(){
   var donttouchthis
   ... do something with it
   return whateveryouvedonewithit
 }

在这种情况下,donttouchthis不是那么容易从"外部"改变的。