Javascript函数返回意外结果

时间:2014-02-02 00:36:57

标签: javascript

我已经编写了大量的Javascript,主要是使用JQuery,但我很难接受一些非常简单的事情。

在下面的代码中(也找到了here),我只想在某些逻辑中使用twoExists()函数的布尔返回值。我不知道为什么会发生这种情况,但它直观地起作用。如同,如果我切换逻辑,我得到我想要的结果。

<html>
    <p>One</p>
    <p>Two</p>
    <p>Three</p>
    <p>Four</p>
    <strong></strong>
</html>

var myJS = {
    twoExists: function() {
       $("p").each(function() {
          if($(this).text() == "Two") {
              return true;
           }
       });

       return false;
    },
    foo: function() {
        if(myJS.twoExists()) {
            $("strong").text("Found two");
        }
        else {
            $("strong").text("Did not find two");
        }
    }

    bar: function() {
        if(! myJS.twoExists()) {
            $("strong").text("Found two");
        }
        else {
            $("strong").text("Did not find two");
        }
     }
}

myJS.foo(); // result: <strong>Did not find two</strong>
myJS.bar(); // result: <strong>Found two</strong>

4 个答案:

答案 0 :(得分:5)

我认为这可能会发生,因为jquery中的每个循环都会返回。 return true的工作方式类似于普通js循环中的continue语句,我认为它不会从twoExists函数返回 - 相反它只是从当前迭代跳转到下一个迭代。也许试试这个:

twoExists: function() {
   var found = false;
   $("p").each(function() {
      if($(this).text() == "Two") {
          found = true;
       }
   });

   return found;
},

答案 1 :(得分:2)

当你从每个返回true时,你将从回调返回,而不是父函数:

   var flag = false;
   $("p").each(function() {
      if($(this).text() == "Two") {
          flag = true;
       }
   });
   return flag;

答案 2 :(得分:1)

正如其他答案所提到的,返回的是each 回调函数的返回值,而不是 twoExists 函数。要解决此问题,您还可以使用简单的for循环:

twoExists: function () {
    var p = document.getElementsByTagName('p'), 
        l = p.length;

    for (var i = 0; i < l; i++)
        if (p[i].textContent === 'Two') return true;

    return false;
}

答案 3 :(得分:0)

由于您已经在使用JQuery,您还可以利用高级选择器并节省一些工作:

twoExists: function () {
    if ($("p:contains(Two)").length) {
        return true;
    }
    return false;
}

其他答案可以很好地了解您当前的行为。您当前的return true;正在从回调返回到.each,而JQuery只会转到下一个元素,因此您的twoExists函数将始终返回false。