如何在函数外部访问JavaScript变量值

4

我一直在为这个问题烦恼,整晚都在奋斗却没有成功。我的目标是在函数外部访问函数中设置的数组值。该怎么做呢?例如:

function profileloader()
{
    profile = [];
    profile[0] = "Joe";
    profile[1] = "Bloggs";
    profile[2] = "images/joeb/pic.jpg";
    profile[3] = "Web Site Manager";
}

接着,在段落标签中我会写一些类似于:

document.write("Firstname is: " + profile[0]);

显然这段代码应该包含在script标签中,但是控制台却报错:"profile[0]未定义"。

有没有人知道我哪里做错了?我似乎无法弄清楚,而且我看到的其他解决方案,无论是从一个函数传递值到另一个函数或者在函数之外传递值,都没有起作用。

感谢任何能帮助我的人,可能是我忽略了一些简单的东西!

2个回答

7
由于您在profile=[];前面没有使用var,因此它存储在全局窗口作用域中。
我怀疑您在使用之前忘记调用profileloader()
声明全局变量的最佳实践是以明显的方式进行声明,就像本页面上其他答案所示。
依赖副作用不被认为是良好的做法。
注释代码以显示正在发生的情况,注意:不推荐使用该方法。
这应该可以工作。而且它确实有效:演示
function profileloader()
{
    profile = []; // no "var" makes this global in scope
    profile[0] = "Joe";
    profile[1] = "Bloggs";
    profile[2] = "images/joeb/pic.jpg";
    profile[3] = "Web Site Manager";
}
profileloader(); // mandatory
document.write("Firstname is: " + profile[0]);

请不要推荐未声明的变量,最好在它们要使用的范围内声明并赋值。 - RobG
1
我在哪里建议未声明的变量? - mplungjan
2
好的,你没有建议声明它们,因此你建议不要声明它们。 :-) - RobG
我现在将我的建议移动到更清晰的位置,我相信这样更好。 - mplungjan
谢谢大家在这里的建议和帮助,多亏了你们的出色贡献,一切都解决了! :-) - GeordieDave1980
非常简单而完美的答案!它存储在全局窗口范围内。 - aiffin

6

将其声明在函数外,以便外部作用域可以看到它(注意全局变量)

var profile = [];
function profileloader(){
    profile[0] = "Joe";
    profile[1] = "Bloggs";
    profile[2] = "images/joeb/pic.jpg";
    profile[3] = "Web Site Manager";
}

或者让该函数返回它:
function profileloader(){
    var profile = [];
    profile[0] = "Joe";
    profile[1] = "Bloggs";
    profile[2] = "images/joeb/pic.jpg";
    profile[3] = "Web Site Manager";
    return profile;
}

var myprofile = profileloader(); //myprofile === profile

1
很好的猜测,但不正确。缺少var使其成为全局变量。 - mplungjan
@mplungjan——这没错。更好的做法是明确声明它为全局变量,以便其他可能在维护代码的人看到后就明确知道其作用域是全局而不是意外的。 - RobG
1
我的意思是,假设OP的问题是由于未声明的变量引起的这一假设是不正确的。如果那不够清楚,我很抱歉。如果重新阅读我的答案,你会发现我并没有建议使用本地声明的全局变量,你会明白我的意思。 - mplungjan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接