2010-03-24 81 views
25

tôi có mã như:Javascript: Cách gọi hàm trả về của hàm ngoài từ hàm bên trong?

function allValid() { 
    $('input').each(function(index) { 
     if(something) { 
      return false; 
     }  
    }); 

    return true; 

} 

mà luôn luôn trả về true như return false; ảnh hưởng đến chức năng bên trong vô danh. Có cách nào dễ dàng để gọi trả lại của hàm ngoài không?

PS. Tôi không tìm cách giải quyết, chỉ muốn biết câu trả lời cho câu hỏi ban đầu. Nếu câu trả lời là "không thể" thì tốt thôi.

Trả lời

15

Vâng, lưu trữ nó trong một biến địa phương.

function allValid() { 
    var allGood = true; 
    $('input').each(function (index) { 
    if (something) { 
     allGood = false; 
    } 
    }); 

    return allGood; 
} 
+4

Điều này không hiệu quả như yếu tố đầu tiên không đúng, phần còn lại 1000 sẽ được kiểm tra. – serg

+3

@ serg555: sau đó làm 'return (allGood = false)' bên trong '.each'. Điều đó sẽ thoát ra khỏi vòng lặp sớm. –

+0

@Roatin Marth - Đó là một đóng cửa chạy cho mỗi phần tử, nó không hoạt động như vòng lặp đơn giản, nghĩ về nó như là một hàm bên trong một hàm. –

5

Bạn cũng có thể làm điều này với bộ lọc:

var anyInvalid = $('input').filter(function(index) { 
        if(inValidCheck) 
        return true; 
       }).length; 

này hoạt động vì 0 được coi là sai, nhưng nó thực sự mang đến cho bạn số không hợp lệ, mà bạn có thể sử dụng để hiển thị "Bạn có 3 mục không hợp lệ "hoặc một cái gì đó nếu bạn muốn.

1

Nếu bạn muốn làm điều này một cách hiệu quả, tôi nghĩ rằng đây là cách tốt nhất:

function allValid() { 
    elements = $('input') 
    for (i = 0; i < elements.length; i++) { invalidityCheck(elements[i]) && return false; } 
    return true; 
} 

Edit: Mặc dù một phiên bản nữa JavaScript-y có lẽ sẽ sử dụng trường hợp ngoại lệ:

function allValid() { 
    try 
    $('input').each(function(index)) { 
     if (something) { throw 'something happened!'; } 
    }); 
    catch (e) { 
    if (e == 'something happened!') { 
     return false; 
    } else { 
     throw e; 
    } 
    } 
    return true; 
} 
+0

@Roatin Marth: Cảm ơn cho mẹo quay trở lại từ .each(). Nó thực sự là tài liệu, tôi chỉ bỏ lỡ điều đó. "http://api.jquery.com/each/" – intuited

+6

Tôi không thấy cách sử dụng ngoại lệ là JavaScript-y nhiều hơn. Bạn không bao giờ nên sử dụng ngoại lệ cho luồng logic, bằng bất kỳ ngôn ngữ lập trình nào. – bcherry

1

Bạn cũng có thể sử dụng Array.prototype.some để lặp lại cho đến khi tìm một phần tử khớp với tiêu chí.

function allValid() { 
    var inputs = $('input'); 
    if(inputs.toArray().some(function(input){ 
     if(something) 
      return true; 
    })) { 
     return false; 
    } else { 
     return true; 
    } 
} 
Các vấn đề liên quan