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

Posted

技术标签:

【中文标题】无法从另一个函数(在全局范围内定义)访问变量(数组)【英文标题】: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) 【参考方案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,这不是一个好习惯。

【讨论】:

以上是关于无法从另一个函数(在全局范围内定义)访问变量(数组)的主要内容,如果未能解决你的问题,请参考以下文章

在函数中创建类并访问在包含函数范围内定义的函数

作用域变量提升函数提升数据类型

笔记(局部变量全局变量)

JavaScript作用域

Javascript命名空间 - 如何根据命名导出函数范围内定义的函数和变量?

将外部 Javascript 与在全局(窗口)范围内定义方法隔离开来