【问题标题】:Difference between accessing variable inside a function by passing as argument and global variable?通过作为参数传递和全局变量访问函数内部变量之间的区别?
【发布时间】:2019-02-17 09:10:02
【问题描述】:

作为参数和不带参数访问函数内部变量有什么区别?

var a = 1;
var b = 2;

function x() {
    var c = a + b;
    console.log(c)
}

function y(a, b) {
    var c = a + b;
    console.log(c)
}

【问题讨论】:

    标签: javascript variables parameters arguments closures


    【解决方案1】:

    这里的关键区别在于y 不使用除了提供给函数的参数之外的任何东西。只要你看到函数调用——比如y(1, 2)——你就知道会发生什么。 (至少假设您相当熟悉该功能及其作用 - 但即使您不熟悉它,也希望它的名称足够清晰。)

    x 的不同之处在于它从外部(此处为全局)变量ab 中读取。换句话说,它依赖于未明确提供给函数的输入。这使得更难理解对x() 的调用会做什么,因为它取决于ab 的值——它们可能在程序中被分配了相当远的距离。事实上,也许它们的值可以以不同的方式和通过其他函数来改变——在这种情况下,如果不仔细研究整个程序直到调用,就不可能确切地知道x() 会做什么。同样,将其与 y 进行对比,我们只需要查看调用站点,无需其他任何内容。

    虽然在某些实际情况下,很难避免某种“全局状态”,但要尽可能避免它,并尝试将函数所需的信息保留在其本地 - 如y -毫无疑问是更好的设计。它使代码更容易理解,因此不太可能出现错误。

    【讨论】:

      【解决方案2】:

      Javascript 总是按值传递,所以改变变量的值永远不会改变底层的原语(字符串或数字)。

      如果您在作为参数传递的函数内部修改variables,则它不会更改原始变量的值(按值传递)。

      var a = 1;
      var b = 2;
      
      function x() {
        var c = a + b;
        a = c;
        console.log(c)
      }
      
      
      function y(a, b) {
        var c = a + b;
        var a = c;
        console.log(c)
      
      }
      
      y(a, b)
      console.log(a)
      console.log(b)
      x()
      console.log(a)
      console.log(b)

      【讨论】:

        【解决方案3】:

        这 3 个案例有不同的目的,有些并不详尽:

        1. 函数内部:

        只有在函数调用后必须卸载变量,除非它被返回

        function helloworld() {
          const words = ['hello', 'world'];
          return words.join(' ');
        }
        
        1. 作为论据:

        每次你想使用一个改变结果的外部值

         function hello(name) {
           return 'Hello ' + name;
         }
        
        1. 从关闭开始:

        在其他情况下:

         // inside a lambda
         function upperThan(array, n) {
           return array.filter(item => item > n);
         }
        
         // use a constant
         const HELLO = 'Hi';
         function sayHello(name) {
           return HELLO + ' ' + name;
         }
        

        【讨论】:

          【解决方案4】:

          在第二个函数的范围内,ab 指的是参数,而不是全局变量。

          var a = 1
          var b = 2
          
          function exampleOne () {
            console.log("example 1: ", a, b)
          }
          
          function exampleTwo (a, b) {
            console.log("example 2: ", a, b)
          }
          
          exampleOne()
          exampleTwo(3, 4)
          exampleTwo()

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-06-16
            • 2015-10-21
            • 1970-01-01
            • 1970-01-01
            • 2016-07-26
            • 2017-12-14
            • 2017-03-08
            • 1970-01-01
            相关资源
            最近更新 更多