如何强制函数创建全局变量

时间:2016-10-10 16:40:11

标签: javascript arrays function

如何强制函数创建全局变量?我有这段代码:

$.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”全局可达?

3 个答案:

答案 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>

间接评估/新功能

间接evalnew 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变量的范围限制为实际使用的区域。