我有以下jquery代码:
$.ajax({
url: 'somefile.php',
type: "POST",
data: "",
dataType: "json",
async: false,
success: function (data) {
var var1 = something;
var var2 = something;
var var3 = something;
var var4 = something;
for (var i = 0; i < data.length; i++) {
$('.somediv').html('');
$('.somediv').append('Somehtml');
}
some_function_declared_later(var1, var2, var3, var4);
}
编译时我收到错误:'var1','var2','var3' & 'var4' are used out of scope
。但是,我认为没有任何问题,因为它们已经在使用它们的同一函数中声明。
请帮忙!
更新:
这可能与当前函数之外的some_function_declared_later
声明有关吗
答案 0 :(得分:7)
更新:您的问题的新版本完全改变了它,并使“编译器”中的错误完全无稽之谈。我发现非常,非常难以相信任何工具会给你从你引用的(更新的)代码中引用的错误,以及所有适当的尊重,我认为你必须提供不同于你认为的代码你是。
您问题的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);
}
更多关于我的博客:Poor misunderstood 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) {
// ....
};
...然后some_function_declared_later
将在其上方的代码中声明(因为var
已悬挂),但如果undefined
,则success
的值可能为some_function_declared_later
handler在将函数分配给{{1}} var的代码行之前运行。 (这似乎不太可能,但我不会那样写,只是为了确定。)