Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中使函数参数保持不变?_Javascript_Ecmascript 6_Constants - Fatal编程技术网

如何在JavaScript中使函数参数保持不变?

如何在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提案)。您

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

这行不通:

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;
}