【问题标题】:Convert private variables into public variables将私有变量转换为公共变量
【发布时间】:2019-01-25 09:09:14
【问题描述】:

我正在尝试发现如何将一些私有变量发送到全局范围。我创建了一个简短的演示:

function test() {
    let private1 = 1, private2 = 2;

    return private1;
}

test(); // returns the first variable value, but not if I have multiple variables
console.log(private1); // returns obvious error - how to make private variable global?

显然,记录任何变量都会返回错误,因为它们仅存在于相对于测试函数的本地范围内。所以我的问题是,如何将这些变量公开?

我从来没有以这种方式使用变量,也找不到任何其他解释这一点的帖子,所以这通常是不好的做法吗?我很想知道。任何关于如何最好地处理变量的解释或指导都会非常有帮助,谢谢。

【问题讨论】:

    标签: javascript jquery function scope


    【解决方案1】:

    在函数内部声明的变量只能在该函数内部使用,除非您在函数外部声明它。

    在这个例子中,你不能在函数之外使用private1

    function test() {
      let private1 = 1;
      return private1;
    }
    test();
    console.log(private1);

    你不能在上述函数的范围之外使它成为全局的。

    在这个例子中,你可以在函数之外使用private1

    let private1;
    
    function test() {
      private1 = 1;
      return private1;
    }
    test();
    console.log(private1);

    【讨论】:

      【解决方案2】:

      从函数内部(不返回对象或数组中的变量)将变量添加到全局(并且仅是全局范围)有两种方法。但是,通过将变量添加到全局范围,您可以使该页面上运行的每个脚本都可以使用它。

      1。确保strict mode 未激活并“忘记”声明变量

      // Dont do "use strict";
      function test() {
          private1 = 1;
          private2 = 2;
          return private1;
      }
      

      当不使用严格模式时,每当 JavaScript 看到一个尚未声明的变量时,它就会自动在全局范围内声明它。不过,这是非常糟糕的做法,应该避免。

      2。将变量直接添加到全局对象中

      function test() {
          window.private1 = 1;
          this.private2 = 2;
          return private1;
      }
      

      可以使用windowthis获取窗口对象。但是this 只会返回window,如果它不是从object 或绑定/应用函数内部调用的。

      返回和解构(ES6)

      ES6 的一个很好的特性(这意味着它不能在像 IE 这样的旧浏览器上使用)是解构,它允许你这样做:

      function test() {
          return { private1: 1, private2: 2 };
      }
      var { private1: private1, private2: private2 } = test();
      

      或者

      function test() {
          return [1, 2];
      }
      var { 0: private1, 1: private2 } = test();
      

      【讨论】:

        【解决方案3】:

        您可以创建全局变量并为其赋值

        let global1,global2;
        function test() {
            let private1 = 1, private2 = 2;
            global1 = private1;
            global2 = private2;
        
            return private1;
        }
        
        test(); 
        console.log(global1); 
        

        或者你可以使用返回值

        function test() {
            let private1 = 1, private2 = 2;
        
            return private1;
        }
        
        var result = test(); 
        console.log(result);
        

        【讨论】:

          【解决方案4】:

          使 private1 全局化的最简单方法是做这样的事情

          let global1
          
          function test() {
              let private1 = 1, private2 = 2;
          
              return private1;
          }
          
          global1 = test()
          

          但是,正如另一个答案所说,如果你想要这个,最好在函数范围之外声明变量。

          【讨论】:

            【解决方案5】:

            let 的作用域是固定的,你不能在函数之外访问它。解决您的问题的方法是将变量绑定到窗口。

            function test() {
                private1 = 1; // or you can use window.private1 = 1
                private2 = 2;
                return private1;
            }
            
            
            test(); 
            console.log(private1);

            如果你没有用var let or const 声明你的变量,它会自动绑定到窗口范围,但这不是一个好的做法。您也可以为此使用window.variableName

            【讨论】:

              【解决方案6】:

              为什么先私有然后再公开?如果您需要一些私有空间,您可以采用 IIFE 并将结果对象解构赋值给全局变量。

              var { private1: global1, private2: global2 } = function () {
                      let private1 = 'foo',
                          private2 = 'bar';
                          
                      return { private1, private2 };
                  }();
              
              console.log(global1, global2);

              【讨论】:

                【解决方案7】:

                只是不要在开头添加任何声明。Javascript 将其视为全局变量。

                function test(){
                   private1 = 1;
                   private2 = 2
                }
                
                test();
                

                函数test调用后,private1 and private2设置为全局变量。

                如果你像这样在测试下面放置一个控制台

                console.log(private1,private2);
                //1 2 is the answer.
                

                它将打印在控制台中,您也可以这样调用它。

                window.private1;
                window.private2;
                

                就是这样。

                【讨论】:

                  【解决方案8】:

                  如果您使用的是浏览器,则可以将它们分配给window

                  function test() {
                    window.private1 = 1, window.private2 = 2;
                  }
                  
                  test()
                  
                  console.log(private1, private2)

                  或者您可以通过返回它们来导出它们:

                  function test() {
                      let private1 = 1, private2 = 2;
                  
                      return {
                        private1,
                        private2
                      };
                  }
                  
                  console.log(test())

                  那么这通常是不好的做法吗?

                  是的,让它们全局是不好的做法。如果在函数本身之外确实需要它们,则将它们导出是可以的。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-05-25
                    • 2011-12-03
                    • 2017-06-30
                    • 2011-05-25
                    • 2014-08-21
                    • 1970-01-01
                    • 2013-01-02
                    • 1970-01-01
                    相关资源
                    最近更新 更多