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

How to force function to create global variable

本文关键字:全局变量 创建 函数 何强制      更新时间:2023-09-26

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

$.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文件并从中创建数组。我如何使数组"行"全局可达?

Scope It Outside Function Scope

如果可以的话,最常见的方法可能是简单地在函数作用域之外声明它:

// 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 = [];
}

注意:这在严格模式下不起作用,严格模式会取消隐式全局变量。您可以在这里阅读有关此方法的更多信息。

存储变量

另一个很好的方法是简单地将对象作为属性存储在window对象上,并从那里访问它,正如Pamblam的回答中提到的那样。

你可以显式地将任何变量赋值给window对象,使其成为"全局"。

function things(){
    window.stuff = "junk";
}
things();
alert(stuff);

尽管您想要的是可以实现的,但我还是建议使用全局变量,并鼓励您重新考虑您的体系结构。全局变量很难维护,而且可能导致错误。


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值的规则)

间接eval/new Function

间接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 ?"这就是所谓的间接eval,你可以在SO答案

下找到更多信息

如你所见,这是可能的。但是,全局变量再次使代码难以维护。您应该将line变量的范围限制在实际使用的区域内。