2013-10-18 110 views
4

我有以下的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声明之外的当前函数有关吗?

+4

*“编译时出现错误”*编译?什么? –

+0

他们不是。它们在'for'范围内定义。 –

+2

@DavidHedlund:这是JavaScript。 'var' * always *在函数范围(或全局范围,如果在任何函数之外使用)创建变量。 –

回答

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,要么就是确实是,但它比语言更具限制性。例如,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.length0)或者循环的最后一次传递的值。


回复您的编辑:

难道这有什么做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悬挂),但它可能如果值undefinedsuccess处理程序在将函数分配给some_function_declared_later变量的代码行之前运行。 (这似乎不大可能,但我不会这么写,只是为了确定。)

+0

谢谢!代码工作正常,但我担心这个警告! – kmdhrm

+0

@DipakYadav:好的,你不应该在你的问题中得到最新版本的代码警告,甚至不会像'jslint'那样超级限制。 –