如何强制函数创建全局变量?我有这段代码:
$.ajax({
url: 'https://dl.dropboxusercontent.com/s/11ofmbg4d4y3gb0/zakaznice_tyden.csv',
dataType: 'text',
}).done(successFunction);
function successFunction(data) {
var promenna = data.replace(/\n/g,";").split(";");
var result = [];
for (var i = 0; i < promenna.length; i+=2) {
var line = [];
line.push(promenna[i]);
line.push(promenna[i+1]);
result.push(line);
}
for (var i = 0; i < result.length; i += 1){
$("#tyden" + i + "").append(result[i][0]);
$("#tyden" + i + "kolik").append(result[i][1]);
}
}
它加载csv文件并从中创建数组。如何使数组“line”全局可达?
答案 0 :(得分:2)
范围外部功能范围
如果这是一个选项,最常见的方法可能是将其声明在函数范围之外:
// This will be globally accessible from any child functions, etc.
var array = [];
function example(){
// Your code here can access the array as expected
}
隐含的全球宣言
如果要声明具有全局范围的变量,请在声明时省略var
,这将隐式地全局创建它:
function example(){
// This will be a global variable
array = [];
}
注意:这不会在严格模式下工作,这会取消隐式全局变量。你可以read more on about this approach here。
存储变量
另一个很好的方法是简单地将对象存储为window
对象上的属性,并从Pamblam's answer中提到的那里访问它。
答案 1 :(得分:0)
您可以通过将任何变量分配给window
对象来明确地使其变为“全局”。
function things(){
window.stuff = "junk";
}
things();
alert(stuff);
答案 2 :(得分:0)
尽管你想要的是可以实现的,但我不建议使用全局变量,并鼓励你重新考虑你的架构。全局变量很难维护并且可能导致错误。
var
总是创建一个具有函数作用域的变量,因此它意味着它可以在声明它的函数和函数内的所有函数中访问(除非在它们内部重新定义)。如果你想让它全球化,无论它在哪里,你有几个选择:
直接分配到不存在的变量
如果您以非严格模式运行代码,只需删除var
即可。这将导致变量line
的查找,并且因为它未在任何上下文中声明,所以它将其指定为全局变量。例如:
function fn() {
line = 1;
}
fn();
console.log(line); //1
但有两个缺点:
ReferenceError
示例:
function outer() {
var line;
function inner {
line = 8; //won't work because there is variable line in some outer context
}
inner();
}
outer();
console.log(line); //undefined
分配给全局对象
在每个JS执行环境中都有一个叫做全局对象的东西。如果你为它分配一个属性,你可以将它用作一个全局变量(除了它不是一个变量 - 差异是微妙的,但有)。例如:
function fn() {
window.line = 1;
}
fn();
console.log(line); //1;
这也有一些缺点:
window
变量下。在Node中它是global
,并且在其他执行环境中可能会有所不同window
(或global
)的变量,它将覆盖该变量(类似于前一点的缺点#2)this
来访问全局对象,但仅限于非严格模式且仅在未明确设置this
的情况下(请参阅计算this
值的规则)< / LI>
间接评估/新功能
间接eval
和new Function
始终执行,就像它们直接在全局范围内声明一样。虽然不优雅且容易出错(使用字符串进行编码),但它们不会遇到以前的缺点 - 即使在严格模式下工作,无论在途中声明了什么变量并独立于执行环境。这很简单:
'use strict';
function fn() {
//choose one of the following:
//indirect eval:
(0, eval)('line=1');
//or new Function
new Function('line=1')();
}
fn();
console.log(line); //1. Works even in strict mode
您可能会问“为什么这个奇怪的(0, eval)(...)
而不仅仅是eval
?这就是所谓的间接评估,您可以找到有关under this SO answer的更多信息
如你所见,这是可能的。但同样,全局变量使您的代码难以维护。您应该将line
变量的范围限制为实际使用的区域。