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

时间:2015-05-18 23:36:25

标签: javascript ecmascript-6 constants

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

这不起作用:

public class CustomADataRetrieverImpl<T, C>: IDataRetriever<T, C> 
             where T : ICollection<string>, new()
{

    public T GetData(C criteria)
    {

        string myCriteria = criteria.ToString();
        T data = new T()
            ...
        return data;
    }
}

有什么想法吗?

8 个答案:

答案 0 :(得分:33)

函数参数将保留在ES6中的可变绑定(如var),你无能为力。您可能获得的最佳解决方案是在const初始化中对arguments object进行解构:

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

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

答案 1 :(得分:12)

您无法创建参数const。将它用作局部变量的初始值:

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

另请注意,自IE11起,Internet Explorer中仅支持const。见compatibility table

答案 2 :(得分:1)

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

只需写一个你不会改变变量的风格。事实上,该语言没有提供任何设施强制你这样做并不意味着你仍然无法做到这一点。

答案 3 :(得分: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
}

答案 4 :(得分:1)

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

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

答案 5 :(得分:-1)

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

正如@Andreas_Gnyp所说,直到ES6,JavaScript中没有let / const。 (一旦ES6完全支持并且完全支持,也不会function(const a) {...}。)如果您想使用const,您可以实现自己的const功能,或者在帮助下开始使用ES6表示法某些第三方ES6到ES5编译器,例如Babel

但是,请记住,ES6表示法中的const 不会使变量不可变。例如。 const a = [1, 2]; a.push(3);是一个完全有效的计划,a将成为[1, 2, 3]const只会 阻止您重新分配a,以便您无法a = []a = {}const a = [1, 2]; {{1}已定义(在该特定范围内)。

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

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

答案 6 :(得分:-2)

首先,JS中没有常量(直到ECMAScript 6提案)。您将不得不使用var来构建类似的东西。如果你想拥有&#34;私人&#34;在JS代码中,您使用了该语言的一个特性,即范围。

所以,例如,像这样:

 var kindaConstant = function(){
   var donttouchthis
   ... do something with it
   return whateveryouvedonewithit
 }

在这种情况下,donttouchthis并非易于在&#34;外部&#34;

中变异。{/ 1>

答案 7 :(得分:-2)

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