如何在JavaScript中使函数参数保持不变?
我想做的是使用尽可能多的不可变变量,从而减少代码中移动部分的数量。我只想在必要时使用“var”和“let” 这行不通:如何在JavaScript中使函数参数保持不变?,javascript,ecmascript-6,constants,Javascript,Ecmascript 6,Constants,我想做的是使用尽可能多的不可变变量,从而减少代码中移动部分的数量。我只想在必要时使用“var”和“let” 这行不通: function constParam(const a){ alert('You want me to '+a+'!'); } 有什么想法吗?在JavaScript中无法强制参数不可变。你必须自己记录下来 只需以一种不改变变量的方式编写即可。该语言没有提供任何工具来强制您这样做,这并不意味着您仍然不能这样做。首先,JS中没有常量(直到ECMAScript 6提案)。您
function constParam(const a){
alert('You want me to '+a+'!');
}
有什么想法吗?在JavaScript中无法强制参数不可变。你必须自己记录下来
只需以一种不改变变量的方式编写即可。该语言没有提供任何工具来强制您这样做,这并不意味着您仍然不能这样做。首先,JS中没有常量(直到ECMAScript 6提案)。您必须使用
var
来构造类似的东西。如果您想在JS代码中有“私有”区域,那么可以使用该语言的一个特性,即作用域
例如,你可以这样说:
var kindaConstant = function(){
var donttouchthis
... do something with it
return whateveryouvedonewithit
}
在这种情况下,
dontouch此
不太容易从“外部”更改。您不能创建参数const
。将其用作局部变量的初始值:
function constParam(a) {
const const_a = a;
...
}
另请注意,自IE11起,Internet Explorer仅支持
const
。请参阅此了解我相信您正在寻找的不可变结构。
正如@Andreas_Gnyp所说,在ES6之前,JavaScript中没有
let
/const
。(一旦ES6推出并完全受支持,也不会有函数(const a){…}
)如果您想使用const
,您可以实现自己的const
功能,或者在第三方ES6到ES5编译器的帮助下开始使用ES6表示法,例如
但是,请记住,ES6表示法中的const
并不会使变量不可变。例如,const a=[1,2];a、 推(3)
是一个完全有效的程序,a
将成为[1,2,3]
const
只会阻止您重新分配a
,这样您就不能执行a=[]
或a={}
或任何一次const a=[1,2]代码>已定义(在该特定范围内)
将确保在定义var a=fromJS([1,2])时编码>并在接收功能a中将a
作为功能参数传递。按压(3)
不会影响a
。这就是您想要实现的吗?在ES6中,函数参数将保持可变绑定(如var
),对此您无能为力。您可能得到的最佳解决方案是在常量中分解
function hasConstantParameters(const a, const b, const c, …) { // not possible
…
}
请注意,如果需要,此函数将具有不同的arity(.length
),您必须声明一些占位符参数。我就是这样做的:
而不是:
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
}
我们可以使用ES6解构从参数创建常量
function test(...args) {
const [a, b, c] = args;
}
常量确实存在于javascript中,并且受到现代浏览器的支持:您的链接以“这是一项实验性技术”开头。。。的确,有些浏览器支持常量。你应该很幸运能为一个项目工作,它可以让你选择浏览器…;-)这不再是实验,这实际上是一个有趣的解决方案。如果它不是那么难看,我会开始使用它代码>?@BugsBunny这几乎是一样的。但是,我不喜欢引入另一个标识符(args
),我确实故意不在通常的位置放置参数,而是将所有内容都移动到const
声明中。使用动态算术破坏了严格性的概念,但是是的,这一个正确地回答了问题@如果算术不是动态的,它只是不再作为函数对象的.length
属性可用。这个答案与我的问题无关。我问的是常量参数,而不是类成员的隐私。@QuentinRoy引用?Es6提供了声明常量值的方法,但无法将函数参数声明为常量。你可以写“function(){const a=…;…}”,但你不能写“function(const a){…}”。你是对的,对不起,我读了fast。我以为你说的是变量而不是参数。这只是Bergi的答案,没有解释。
function F(){const[a, b, c, d, e, f, g] = arguments;
// lorem
// ipsum
}
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
function test(...args) {
const [a, b, c] = args;
}