如何让JavaScript中的函数参数常量?
How to make function parameter constant in JavaScript?
我想做的是尽可能多地使用不可变变量,从而减少代码中移动部分的数量。我只想在必要时使用 "var" 和 "let"。
这行不通:
function constParam(const a){
alert('You want me to '+a+'!');
}
有什么想法吗?
在 JavaScript 中无法强制参数不可变。你必须自己跟踪。
只需以一种碰巧不改变变量的风格来编写。事实上,该语言没有提供任何工具来强制你这样做并不意味着你仍然不能这样做。
首先,JS中没有常量(直到ECMAScript 6提案)。您将不得不使用 var
来构造类似的东西。如果你想在你的 JS 代码中有 "private" 个区域,你可以使用该语言的功能之一,即范围。
所以,例如,像这样:
var kindaConstant = function(){
var donttouchthis
... do something with it
return whateveryouvedonewithit
}
在这种情况下,donttouchthis
并不容易从 "outside" 改变。
您不能创建参数const
。用它作为局部变量的初始值:
function constParam(a) {
const const_a = a;
...
}
另请注意,const
仅在 IE11 及更高版本的 Internet Explorer 中受支持。看到这个 compatibility table
对于不可变结构,我相信您正在寻找 Immutable.js。
正如@Andreas_Gnyp 所说,在 ES6 之前,JavaScript 中没有 let
/ const
。 (一旦 ES6 出来并得到完全支持,也不会有 function(const a) {...}
。)如果你想使用 const
,你可以实现你自己的 const
特性,或者在帮助下开始使用 ES6 符号一些第三方 ES6-to-ES5 编译器,例如 Babel.
但是,请记住,ES6 表示法中的 const
不会 使变量不可变。例如。 const a = [1, 2]; a.push(3);
是一个完全有效的程序,a
将变为 [1, 2, 3]
。 const
将 仅 阻止您重新分配 a
,因此您不能执行 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
.这是你想要达到的目标吗?
函数参数将在 ES6 中保持可变绑定(如 var
),对此您无能为力。您获得的最佳解决方案可能是在 const
初始化中解构 arguments
object:
function hasConstantParameters(<s>const a, const b, const c, …</s>) { // not possible
…
}
function hasConstantParameters() {
const [a, b, c, …] = arguments;
…
}
请注意,此函数将具有不同的元数 (.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
}
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
我们可以使用 ES6 解构从参数创建常量
function test(...args) {
const [a, b, c] = args;
}
我想做的是尽可能多地使用不可变变量,从而减少代码中移动部分的数量。我只想在必要时使用 "var" 和 "let"。
这行不通:
function constParam(const a){
alert('You want me to '+a+'!');
}
有什么想法吗?
在 JavaScript 中无法强制参数不可变。你必须自己跟踪。
只需以一种碰巧不改变变量的风格来编写。事实上,该语言没有提供任何工具来强制你这样做并不意味着你仍然不能这样做。
首先,JS中没有常量(直到ECMAScript 6提案)。您将不得不使用 var
来构造类似的东西。如果你想在你的 JS 代码中有 "private" 个区域,你可以使用该语言的功能之一,即范围。
所以,例如,像这样:
var kindaConstant = function(){
var donttouchthis
... do something with it
return whateveryouvedonewithit
}
在这种情况下,donttouchthis
并不容易从 "outside" 改变。
您不能创建参数const
。用它作为局部变量的初始值:
function constParam(a) {
const const_a = a;
...
}
另请注意,const
仅在 IE11 及更高版本的 Internet Explorer 中受支持。看到这个 compatibility table
对于不可变结构,我相信您正在寻找 Immutable.js。
正如@Andreas_Gnyp 所说,在 ES6 之前,JavaScript 中没有 let
/ const
。 (一旦 ES6 出来并得到完全支持,也不会有 function(const a) {...}
。)如果你想使用 const
,你可以实现你自己的 const
特性,或者在帮助下开始使用 ES6 符号一些第三方 ES6-to-ES5 编译器,例如 Babel.
但是,请记住,ES6 表示法中的 const
不会 使变量不可变。例如。 const a = [1, 2]; a.push(3);
是一个完全有效的程序,a
将变为 [1, 2, 3]
。 const
将 仅 阻止您重新分配 a
,因此您不能执行 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
.这是你想要达到的目标吗?
函数参数将在 ES6 中保持可变绑定(如 var
),对此您无能为力。您获得的最佳解决方案可能是在 const
初始化中解构 arguments
object:
function hasConstantParameters(<s>const a, const b, const c, …</s>) { // not possible
…
}
function hasConstantParameters() {
const [a, b, c, …] = arguments;
…
}
请注意,此函数将具有不同的元数 (.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
}
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
我们可以使用 ES6 解构从参数创建常量
function test(...args) {
const [a, b, c] = args;
}