【问题标题】:JavaScript Strange Array Scope IssueJavaScript奇怪的数组范围问题
【发布时间】:2012-12-01 19:18:51
【问题描述】:

所有源代码都可以在这里找到:只需查看页面源代码。一半代码在该页面上,另一半在源代码中链接的“deputyDepot.js”文件中,也应该是可见的。

只是一些事情:这显然仍在进行中。我在编码时非常杂乱无章,我倾向于跳来跳去,做一些这个和那个。所以有点乱。还有背景。我们就假装它不存在,好吗?

那么现在,解决问题!我似乎无法在任何函数中访问数组。

目前,我一直在测试的方式是修改我的 main 函数(称为 weTalkNow(input))。它位于代理Depot.js 中。我将它设置为返回我正在测试的任何值,以查看它们的设置。这些值会打印在我的聊天框中。所以我像 console.log() 一样使用它。目前它设置为返回用户输入的长度,但这完全无关紧要。

_inputArray 通过获取用户输入(字符串)并将其拆分为空格来填充。它在页面顶部声明。这一切都很好。

出现问题的地方是如果手动填充数组。

var x = [ [1,2], [3,4] ];
/* Main Function */
function weTalkNow(){
    return x[0][0];
}

据我所知,该代码应该输出 1。但事实并非如此。将代码修改为这样,就可以正常工作了:

/* Main Function */
function weTalkNow(){
    var x = [ [1,2], [3,4] ];
    return x[0][0];
}

但是,这不是很有帮助。我需要一个全局数组,而不是本地数组。

让事情真正奇怪的是,如果我决定声明

var x = [ [1,2], [3,4] ];

在我的主页(带有 HTML 和其他内容的页面)上,然后执行此操作

/* Main Function */
function weTalkNow(){
    return x[0][0];
}

在代理Depot.js 文件中,它工作正常。突然间,如果我在不同的页面上声明一个全局数组,它就可以正常工作了。

如果我能以任何方式澄清任何观点,请告诉我。我试图提供我能提供的所有信息。也欢迎随机的小贴士,但我主要关注的是这个。

再次,我很清楚:无论出于何种原因,如果我手动填充它们,我将无法使用数组(我认为这与问题有关)。 _inputArray 工作正常,因此该数组可以正常工作。它是唯一这样做的全局数组。但它不是手动填充的,而是通过 split 函数填充的。我似乎无法创建一个可由函数访问的全局数组。

编辑:

好的,我找到了问题!我正在编写的所有代码都可以正常工作,就像它应该的那样。问题是我的 .js 文件的最顶部是一个损坏的函数。第一行阻止了它下面的所有代码运行,因此我的数组从一开始就没有被初始化。因此,我无法访问它们。

一旦我检查了网络控制台,我就能解决所有问题。在发布这个问题之前,我不知道有一个网络控制台。

【问题讨论】:

  • 您的页面有 JavaScript 错误。先解决这些问题。
  • @user1689607 需要更具体一点吗?
  • 我的意思是当我加载页面时控制台中显示错误。您是否打开了浏览器的开发者控制台?
  • 哦。哦。谢谢你。这有助于解决问题。我也没有意识到有一个控制台。你帮了我很大的忙。
  • 不客气。仅供参考,控制台有多种工具可用于在应用程序中进行故障排除,例如用于检查数据的 console.log(),以及可让您从断点开始逐步执​​行代码的调试器。

标签: javascript arrays scope


【解决方案1】:

如果您的函数引用了在调用函数的行下方声明的数组,则该数组将不在范围内。

myFunc();

function myFunc () {
    console.log(ra[0]); // won't work
};

var ra = ["a"];

这将起作用:

var ra = ["a"];

myFunc();

function myFunc () {
    console.log(ra[0]); // will work
};

要记住的另一件事是,javascript 包含也是按顺序处理的。还有一件事:换句话说,一般来说javascript是从上到下处理的;函数不能调用或引用文件中下一行定义的变量,这是一个例外。例外是您正在使用的命名函数。

这行不通。

var funcA = function () {
    funcB(); // wont work
};

funcA();

var funcB = function () {
    console.log("from funcB");
};

这将起作用:

funcC(); // works fine

function funcC () {
    funcD(); // works fine
}

function funcD () {
    console.log("from funcD");
};

这些细微的差异可能被认为代表了不完美的设计,但它们可以很好地工作。

【讨论】:

  • 这是非常有用的信息。但是我所有的函数都被命名了,我没有在使用它们的函数下面声明任何数组。
  • 我明白了。您能否重现您在 jsfiddle.net 上遇到的问题的简化版本?我在您提供的链接中找不到您在问题中提到的代码。
  • 感谢您的帮助!我最终解决了它。我编辑了我的问题以反映这一点。
  • 嗯,不完全是。声明(“var”)和声明(“=”)是不同的东西。 JS 不关心你的声明出现的顺序,只要它们在同一个范围内。此功能称为“提升”。重要的是你的任务发生在哪里。对于 esample,这将起作用:ra=["a"];funcA();function funcA(){..};var ra;
  • @Pumbaa80 这很有趣。感谢您的澄清。
猜你喜欢
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
相关资源
最近更新 更多