更新:您的问题的新版本彻底改变它,并使“编译器”的错误完全废话。我发现很难相信任何工具都会给你提供你引用的(更新的)代码引起的错误,并且所有的应有的尊重,我认为你必须为它提供比你想象的代码更多的代码你是。
为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,要么就是确实是,但它比语言更具限制性。例如,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);
}
更多关于我的博客:Poor misunderstood var
现在,即使是缺席的神秘编译器错误,该代码看起来相当奇怪。您正在分配和重新分配循环中的变量,然后在循环之外使用它们。所以他们或者是undefined
(如果data.length
是0
)或者循环的最后一次传递的值。
回复您的编辑:
难道这有什么做some_function_declared_later当前函数外部声明???
No.如果问题是some_function_declared_later
没有被定义为那行代码,那么错误会抱怨some_function_declared_later
,而不是变量。
函数声明,如var
语句,被提升到它们出现的范围的顶部。所以,如果你有更进一步的下降:
function some_function_declared_later(a, b, c, d) {
// ....
}
...你很好(除了奇怪的循环)。
如果你有这个进一步下跌:
var some_function_declared_later = function(a, b, c, d) {
// ....
};
...然后some_function_declared_later
将被宣布为它上面的代码(因为var
悬挂),但它可能如果值undefined
success
处理程序在将函数分配给some_function_declared_later
变量的代码行之前运行。 (这似乎不大可能,但我不会这么写,只是为了确定。)
*“编译时出现错误”*编译?什么? –
他们不是。它们在'for'范围内定义。 –
@DavidHedlund:这是JavaScript。 'var' * always *在函数范围(或全局范围,如果在任何函数之外使用)创建变量。 –