无法从另一个函数(在全局范围内定义)访问变量(数组)
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
,这不是一个好习惯。
【讨论】:
以上是关于无法从另一个函数(在全局范围内定义)访问变量(数组)的主要内容,如果未能解决你的问题,请参考以下文章