无法从另一个函数(在全局范围内定义)中访问变量(数组)

时间:2019-05-31 19:03:16

标签: javascript jquery arrays function variables

我想使用另一个函数中的变量(数组)。我已经在全局范围内定义了它,但是它不起作用。

这是我的代码,用于更好地理解:

var globalData = '';
var data = '';

$.getJSON('https://...' + data[x].id + '.json', function(data) {

    globalData = data;                                  
    data = globalData.name;

    console.log(data); // works just fine                                   

    if (condition === 1) {
        function2(); // calls this function
    } else {
        function3();
    }
});

function function2() {
    console.log(data); // just an empty line
    console.log(globalData); // UPDATE: works just fine
}

3 个答案:

答案 0 :(得分:4)

问题在于变量data在回调函数中被遮盖了。

function(data) {

    globalData = data;                                  
    data = globalData.name;

    console.log(data); // works just fine  
...

因此function(data)建立了一个作用于函数的局部变量。然后发生了奇怪的分配和重新分配的事情。您想相信自己正在操纵data的全局版本,但是仅在处理作用域版本。

因此,变量data必须传递给函数。

如果您想使用全局变量(不建议使用),您要做的就是将函数声明从(data)更改为其他标识符。

答案 1 :(得分:0)

问题是您有两个名称为data的变量,一个是本地变量,而另一个是全局变量。因此,当以下行

data = globalData.name;

不更改全局变量,而只是更改局部变量。

一种解决方案是为全局变量使用不同的名称。

var globalData = '';
var data2 = '';

$.getJSON('https://...' + data[x].id + '.json', function(data) {

    globalData = data;                                  
    data2 = globalData.name;

    console.log(data2); // works just fine                                   

    if (condition === 1) {
        function2(); // calls this function
    } else {
        function3();
    }
});

function function2() {
    console.log(data2); // just an empty line
}

答案 2 :(得分:0)

您将相同的变量名用于两种不同的事物。您在全局范围内有一个名为data的变量,并且getJSON回调函数参数也有一个名为data的参数,它隐藏了data全局变量。另外,在该回调中,您正在修改data变量。如果您打算修改作为参数传递的data,那么这不是一个好习惯。