更新:您的问题的新版本完全改变了它,并使“编译器”中的错误完全无稽之谈。我发现非常非常难以相信任何工具都会给您从您引用的(更新的)代码中引用的错误,并且恕我直言,我认为您提供的代码一定与您认为的不同你是。
您的问题处理程序的原始代码success
如下所示:
function (data) {
for (var i = 0; i < data.length; i++) {
var var1 = data[i][0];
var var2 = data[i][1];
var var3 = data[i][2];
var var4 = data[i][3];
$('.somediv').html('');
$('.somediv').append('Somehtml');
}
some_function_declared_later(var1, var2, var3, var4);
}
...下面的答案与该代码有关。在您的问题中使用最新版本的代码。
原始答案:
您在评论中说过,有问题的“编译器”是“我的虚拟主机提供的一些在线工具”。
你说得对,这些变量在范围内。要么该工具不理解 JavaScript,要么它可以理解,但它正在做比语言更严格的“lint”事情。jslint
,例如,会给你一个这样的错误(“不要在循环中声明变量”)。(注意:jslint
给你很多“错误”,实际上只是它的作者对应该如何做的看法。)在 JavaScript 中,声明的变量var
在整个函数中声明,因为 JavaScript(当前)没有块范围,只有函数作用域和全局作用域。您的success
处理程序代码与此完全相同:
function (data) {
var var1, var2, var3, var4;
for (var i = 0; i < data.length; i++) {
var1 = data[i][0];
var2 = data[i][1];
var3 = data[i][2];
var4 = data[i][3];
$('.somediv').html('');
$('.somediv').append('Somehtml');
}
some_function_declared_later(var1, var2, var3, var4);
}
更多关于我的博客:可怜的误解var
现在,即使没有来自神秘编译器的错误,这段代码看起来也很奇怪。您在循环中分配和重新分配变量,然后在循环外使用它们。所以它们要么是undefined
(如果data.length
是0
),要么是循环最后一次传递的值。
重新编辑:
这可能与当前函数之外的 some_function_declared_later 声明有关吗?
不。如果问题some_function_declared_later
没有在该代码行中定义,那么错误会抱怨some_function_declared_later
,而不是 vars。
函数声明,就像var
语句一样,被提升到它们出现的范围的顶部。因此,如果您将其进一步降低:
function some_function_declared_later(a, b, c, d) {
// ....
}
...你很好(除了奇怪的循环)。
如果你有这个进一步:
var some_function_declared_later = function(a, b, c, d) {
// ....
};
...thensome_function_declared_later
将被声明为它上面的代码(因为被提升),但如果处理程序在将函数分配给var的代码行之前运行var
,它可能具有该值。(这似乎不太可能,但我不会那样写,只是为了确定。)undefined
success
some_function_declared_later