更新:您的問題的新版本徹底改變它,並使「編譯器」的錯誤完全廢話。我發現很難相信任何工具都會給你提供你引用的(更新的)代碼引起的錯誤,並且所有的應有的尊重,我認爲你必須爲它提供比你想象的代碼更多的代碼你是。
爲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 *在函數範圍(或全局範圍,如果在任何函數之外使用)創建變量。 –