2012-12-04 110 views
0

我有一個難以想象的巨大訂單,我正在梳理值和構建數組。除此之外,我還有一些需要從中提取值的迭代,將它們附加到之後使用的變量上。問題是這些值返回undefined,我認爲這是因爲它們被分配在循環中。jquery傳遞函數外的變量值

這裏是我的邏輯:

  • 聲明變量
  • 遍歷每個
    • 將值分配給變量
  • 後到陣列

我的理解是,變量聲明功能外允許我在全球範圍內使用它。猜猜我錯了!

這裏有一個的jsfiddle:http://jsfiddle.net/x7CL6/

下面的代碼:

$('a').click(function(event){ 

    event.preventDefault(); 

/* Declare Variables */ 

    var test = [], 
     one, 
     two, 
     three, 
     four, 
     el, 
     kind, 
     val; 

/* Loop through each paragraph */ 

    $('section').find('p').each(function(){ 

     el = $(this); 
     kind = el.attr('class'); 
     val = el.html(); 

     if (val === '1'){ 

      one = val; 
     } else if (val === '2'){ 

      two = val; 
     } else if (val === '3'){ 

      three = val; 
     } else if (val === '4'){ 

      four = val;  
     } 
    }); 

    test.push({ 
     one: one, 
     two: two, 
     three: three, 
     four: four 
    }); 

    console.log(test); 
}); 
​ 
+0

@nnnnnn它的工作,但後來我不得不在陣列中的四個對象,我只想要一個,與四個屬性 – technopeasant

回答

0

「我的理解是,在函數外的變量聲明允許我在全球範圍內使用它。」

變量是全球如果聲明外任何功能。在你的情況下,你的所有變量都是在click處理函數中定義的,所以所有的變量都可以在其中被訪問,並且任何嵌套的函數,包括你的回調。

如果意圖是,每次點擊應該增加另一個對象的數組test,那麼你需要定義test單擊處理程序。

變量未定義的原因是因爲您的if/else條件始終爲false,因此變量永遠不會被賦值。您的val變量會從循環的當前元素中分配html內容,並且html內容永遠不會等於您比較的字符串"1""2"等。

我想你可能是爲了比較各元素的class屬性,這樣你們已經把在kind變量:

if (kind === "1") 

等等:http://jsfiddle.net/x7CL6/4/

...但考慮到你似乎正在處理元素的文檔順序,你可以利用這個事實,即jQuery通過你的.each()回調當前元素的索引:

$('section').find('p').each(function(i){ // add i param 
    // inside the loop test i (note it starts with 0) 
    // instead of testing val or kind 

演示:http://jsfiddle.net/x7CL6/2/

但是,仍然留下一個醜陋的if/else if/...結構,你能避免這樣的:

var test = [], 
    propNames = ["one","two","three","four"], 
    obj = {}; 

$('section').find('p').each(function(i){ 
    obj[ propNames[i] ] = $(this).html(); 
}); 

test.push(obj); 

演示:http://jsfiddle.net/x7CL6/5/

+0

的小提琴簡直是過於簡單化了,返回錯誤的條件只是我的sl ty錯字。爲此道歉。否則,根據你的解釋和調整我的小提琴,似乎我的邏輯是堅實的。這意味着我需要尋找它與我正在開發的程序之間的差異。拖動!謝謝你的幫助。 – technopeasant