2011-01-26 5 views
1

У меня есть функция, которую я хочу вернуть true или false.Как вернуть значение изнутри интернатора в Javascript

Внутри функции я повторяю некоторые элементы на странице и проверяю их значения.

Но если я положил оператор return внутри итератора, он вернется с анонимной функции вправо? (а не внешняя функция).

function someElementHasZeroValue() { 
    $('.some-class').each(function(){ 
    if($(this).html() == '0'){ 
     return true; 
    } 
    }); 
    return false; 
} 

Так что эта функция всегда возвращает false независимо от того, что.

Каков наилучший способ для этого? Решение, похоже, работает, но оно не выглядит очень элегантным.

function someElementHasZeroValue() { 
    elements_found_with_zero_value = 0; 
    $('.some-class').each(function(){ 
    if($(this).html() == '0'){ 
     elements_found_with_zero_value += 1; 
    } 
    }); 

    if(elements_found_with_zero_value > 0){ 
    return true; 
    }else { 
    return false; 
    } 
} 

В более общем плане, кто-нибудь знает, почему Javascript требует перебора элементов с анонимной функции, в отличие от нормального итератора, как и большинство языков, или есть какой-то способ сделать это, я не знаю?

ответ

2

Вы используете jQuery, а не чистый Javascript. Вы могли бы сделать нормальный цикл:

function someElementHasZeroValue() { 
    var selection = $('.some-class'); 
    for (var i = 0; i < selection.length; i++) { 
     if ($(selection[i]).html() === '0') { 
      return true; 
     } 
    } 
    return false; 
} 

В качестве альтернативы, вы можете сделать это в более JQuery-как способ:

function someElementHasZeroValue() { 
    return $('.some-class').filter(function(){ 
     return $(this).html() === '0'; 
    }).length > 0; 
} 
3

Вам понадобится решение, подобное вашему, но это может быть немного проще.

function someElementHasZeroValue() { 
     // this is the return value, initialized as false 
    var ret = false; 
    $('.some-class').each(function(){ 
    if($(this).html() == '0'){ 
     ret = true; // set it to true 
    } 
    }); 
    return ret; // return the value of "ret" 
} 

Кроме того, если вы хотите, чтобы разорвать петлю .each() когда if() успешно, вы можете добавить return false;, который будет разорвать петлю без возврата функции.

if($(this).html() == '0') { 
     ret = true; // set it to true 
     return false; // break the each() loop 
    } 
1

Ну, JavaScript не требует этого от вас. Это jQuery, который это делает. С помощью JavaScript вы можете делать обычные для циклов и возвращаться из него таким образом. jQuery's each() будет поэтапно возвращать объект jQuery для всех совпадений используемого вами селектора. Вы могли бы сделать что-то вроде этого:

function someElementHasZeroValue() { 
    var returnValue = false; 
    $('.some-class').each(function(){ 
    if($(this).html() == '0'){ 
     returnValue = true; 
    } 
    }); 
    return returnValue; 
} 
1

function someElementHasZeroValue() { 
    var result = false; 

    $('.some-class').each(function() { 
    if (($this).html() == '0') { 
     result = true; 
     return false; 
    } 
    }); 

    return result; 
} 

Пожалуйста, обратите внимание, что return false внутри each обратного вызова означает, что мы должны прервать итерации (см Jquery документацию), это похоже на break в «нормальных циклов».

Также всегда предпочитайте объявление переменных с помощью var (используйте локальные вместо глобальных переменных).

Смежные вопросы