2013-10-18 178 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'那樣超級限制。 –