变量如何超出范围?

kmd*_*hrm 4 javascript jquery scope

我有以下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);
             }
Run Code Online (Sandbox Code Playgroud)

在编译时我收到错误:'var1','var2','var3' & 'var4' are used out of scope.但是,我认为没有问题,因为它们已被声明在使用它们的同一功能中.

请帮忙!

更新:这可能与some_function_declared_later当前函数外部的声明有关吗???

T.J*_*der 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);
 }
Run Code Online (Sandbox Code Playgroud)

......以下答案与该代码有关.在您的问题中使用最新版本的代码.

原始答案:

你在评论中说过,所讨论的"编译器"是"我的webhost给出的一些在线工具".

你说得对,这些变量在范围内.要么该工具不理解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);
 }
Run Code Online (Sandbox Code Playgroud)

更多关于我的博客:可怜的误会var

现在,即使没有来自神秘编译器的错误,这段代码似乎也很奇怪.您在循环中分配和重新分配变量,然后在循环外使用它们.所以它们要么是undefined(如果data.length0),要么是循环最后一次传递的值.


重新编辑:

这可能与当前函数之外的some_function_declared_later声明有关吗???

没有.如果问题没有some_function_declared_later被定义为那行代码,那么错误会some_function_declared_later引发抱怨,而不是vars.

函数声明(如var语句)将被提升到它们出现的作用域的顶部.所以,如果你进一步下降:

function some_function_declared_later(a, b, c, d) {
    // ....
}
Run Code Online (Sandbox Code Playgroud)

...你很好(除了奇怪的循环).

如果你有进一步下跌:

var some_function_declared_later = function(a, b, c, d) {
    // ....
};
Run Code Online (Sandbox Code Playgroud)

...然后some_function_declared_later将被声明为它上面的代码(因为var被提升),但undefined如果success处理程序在将函数分配给some_function_declared_latervar 的代码行之前运行,它可能具有值.(这似乎不太可能,但我不会这样写,只是为了确定.)