【问题标题】:Can't access variable (array) from another function (defined in global scope)无法从另一个函数(在全局范围内定义)访问变量(数组)
【发布时间】:2019-10-17 10:08:52
【问题描述】:

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

这是我的代码以便更好地理解:

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
}

【问题讨论】:

  • 虽然我的第一个想法是这是一个异步问题,但我不认为它是 - function2 确实在回调内部调用。我认为问题是由于data 变量的阴影
  • @Tony - OP 确实在回调中调用该函数。
  • @RobinZigmond 感谢您的回复。在我的示例中如何解决这个问题?
  • 这不是异步问题。我会为你重新提问并回答这个问题。
  • function(data) {

标签: javascript jquery arrays function variables


【解决方案1】:

问题是变量data 在回调函数中被隐藏了。

function(data) {

    globalData = data;                                  
    data = globalData.name;

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

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

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

如果您更喜欢使用全局(不推荐),您只需将函数声明从 (data) 更改为其他标识符。

【讨论】:

    【解决方案2】:

    问题是您有两个名称为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
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 2021-12-22
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2013-06-30
        相关资源
        最近更新 更多