我试图发现如何将一些私有变量发送到全局范围。我创建了一个简短的演示:
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?
显然,记录任何变量将返回错误,因为它们仅存在于相对于测试功能的本地范围内。所以我的问题是,如何将这些变量公开?
我从不需要这样使用变量,也没有找到其他解释此问题的帖子,所以这通常是不好的做法吗?我很好奇。谢谢。关于如何最好地对待变量的任何解释或指导都将非常有帮助。
答案 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)
有两种方法可以从函数内部将变量添加到全局变量(并且仅在全局范围内)(不返回对象或数组中的变量)。不过,通过将变量添加到全局范围,可以使该变量可用于该页面上运行的每个脚本。
strict mode
并“忘记”声明变量// Dont do "use strict";
function test() {
private1 = 1;
private2 = 2;
return private1;
}
当不使用严格模式时,只要JavaScript看到未声明的变量,它就会自动在全局范围内声明它。但是,这是非常糟糕的做法,应该避免。
function test() {
window.private1 = 1;
this.private2 = 2;
return private1;
}
可以使用window
或this
获取窗口对象。但是this
仅在未从window
或绑定/应用函数内部调用的情况下才返回object
。
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;
就是这样。