将私有变量转换为公共变量

时间:2019-01-25 09:09:15

标签: javascript jquery function scope

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

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?

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

我从不需要这样使用变量,也没有找到其他解释此问题的帖子,所以这通常是不好的做法吗?我很好奇。谢谢。关于如何最好地对待变量的任何解释或指导都将非常有帮助。

8 个答案:

答案 0 :(得分:7)

除非在函数外部声明变量,否则在函数内部声明的变量仅在该函数内部可用。

在此示例中,您不能在函数外部使用 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);

答案 1 :(得分: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();

答案 2 :(得分:1)

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

DataSource

或者您可以使用返回值

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

    return private1;
}

test(); 
console.log(global1); 

答案 3 :(得分:1)

使private1全球通用的最简单方法是执行类似的操作

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

    return private1;
}

var result = test(); 
console.log(result);

但是,正如另一个答案所说,如果您愿意,最好在函数范围之外声明变量。

答案 4 :(得分:1)

如果您使用的是浏览器,则可以将它们分配给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())

  

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

是的,将它们设置为 global 是不好的做法。不过,如果确实需要在函数本身之外导出它们,则可以。

答案 5 :(得分:1)

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 :(得分:1)

为什么先私有然后再公开?如果需要一些私有空间,则可以使用IIFE并将结果对象进行解构分配,以分配给全局变量。

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

console.log(global1, global2);

答案 7 :(得分:1)

只需在开始处不添加任何声明。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;

就是这样。