【问题标题】:How to make function parameter constant in JavaScript?如何在 JavaScript 中使函数参数保持不变?
【发布时间】:2015-07-30 14:55:39
【问题描述】:

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

这行不通:

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

有什么想法吗?

【问题讨论】:

    标签: javascript ecmascript-6 constants


    【解决方案1】:

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

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

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

    【讨论】:

    • 这实际上是一个有趣的解决方案。如果它不是那么难看,我会开始使用它。
    • function hasConstantParameters(...args) { const [a, b] = args; }; 怎么样?
    • @BugsBunny 这几乎是一样的。但是,我不喜欢引入另一个标识符 (args),并且我故意在通常的位置不放置任何参数,而是将所有内容都移到了 const 声明中。
    • 用动态参数制作它会破坏严格的概念,但是是的,这个回答正确!
    • @shal arity 不是动态的,它只是不再作为函数对象的.length 属性提供
    【解决方案2】:

    您不能创建参数const。将其用作局部变量的初始值:

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

    另请注意,const 仅在 IE11 起的 Internet Explorer 中受支持。看到这个compatibility table

    【讨论】:

      【解决方案3】:

      对于不可变结构,我相信您正在寻找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。这是你想要达到的目标吗?

      【讨论】:

      • 这个答案与我的问题无关。我问的是常量参数,而不是班级成员的隐私。
      【解决方案4】:

      没有办法强制参数在 JavaScript 中是不可变的。您必须自己跟踪。

      只要写出你碰巧不会改变变量的风格。语言没有提供任何工具强制你这样做并不意味着你仍然不能这样做。

      【讨论】:

      • @QuentinRoy 参考资料? Es6 提供了声明常量值的方法,但没有办法将 函数参数 声明为常量。可以写“function(){ const a = ...; ...}”,但不能写“function(const a){...}”。
      • 你说得对,对不起,我读得太快了。我以为你在谈论变量而不是参数。
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        这就是我的工作:

        代替:

        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
        }
        

        【讨论】:

        • 这只是Bergi的回答,没有解释。
        【解决方案7】:

        首先,JS 中没有常量(直到 ECMAScript 6 提案)。您将不得不使用var 来构建类似的东西。如果你想在你的 JS 代码中拥有“私有”区域,你可以使用该语言的特性之一,即作用域。

        所以,例如,像这样:

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

        在这种情况下,donttouchthis 并不那么容易从“外部”改变。

        【讨论】:

        • 常量确实存在于 javascript 中并且被现代浏览器支持:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
        • 您的链接以“这是一项实验性技术”字样开头……确实,某些浏览器支持常量。你应该很幸运为一个项目工作,它可以让你选择浏览器...... ;-)
        • 它不再是实验性的
        【解决方案8】:
        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-13
          • 2020-09-16
          • 2019-09-07
          • 1970-01-01
          • 1970-01-01
          • 2010-09-24
          • 2018-12-17
          相关资源
          最近更新 更多