在javascript中返回if子句中的值

时间:2013-12-13 01:51:31

标签: javascript

_editor: function () {
  //retrieve all the editors on the current page
  var editors = window.tinymce.editors;
  var container = this.element;
  //pick one that's associated with current container
  $(editors).each(function (i, ed) {
    if (ed.id == container.id) {
      return ed; // even if this is invoked,
    }
  });
  // undefined is returned
}

我必须将上面的代码更改为

_editor: function () {
  //retrieve all the editors on the current page
  var editors = window.tinymce.editors;
  var container = this.element;
  var editor;      
  $(editors).each(function (i, ed) {
    if (ed.id == container.id) {
      editor = ed; // do not return yet. Store it.
    }
  });
  return editor; // return here
}

我认为这是因为JavaScript的范围特征。有人可以解释1)这是否只是JavaScript中固有的2)上述代码中每个功能范围究竟发生了什么?

谢谢。

4 个答案:

答案 0 :(得分:4)

在第一种情况下,您将从传递给$(editors).each的匿名函数返回一个值,而不是外部函数。在第二种情况下,您将从外部函数返回。

这几乎适用于任何允许嵌套函数的语言。 return仅从最里面的函数返回。

答案 1 :(得分:3)

each调用的函数返回:

 $(editors).each(function (i, ed) { // <---
    if (ed.id == container.id) {          |
      return ed; // <--- this exits this --
  

是[this]仅在JavaScript [?]

中固有的

不,许多使用匿名函数的语言,也称为lambdas,都是这样运作的。一些例子是C#和ruby。调用return退出自己,而不是它们被调用的函数。

  

上述代码中每个功能范围究竟发生了什么?

$(editors).each(function (i, ed) {
    if (ed.id == container.id) {
      editor = ed; // do not return yet. Store it.
    }
  });

ed中的每个元素$(editors)调用一次函数体。当循环退出时,ed.id == container.id的最后一个值将存储在editor中。第二个参数i是每次迭代中递增的索引(0,1,2,3,...)。

答案 2 :(得分:3)

问题是您有嵌套函数。您具有分配给_editor属性的函数,并且在其中您有一个由$.each()调用的函数。 return语句从最近的包含函数返回,因此在第一个示例中,它从$.each()迭代函数返回,而不是_editor函数。

$.each()使用迭代函数的返回值来确定是否继续循环 - 如果函数返回false,它将在该元素处停止(类似于使用break;语句在forwhile循环中。

答案 3 :(得分:3)

  

有人可以解释1)这是否只是JavaScript中固有的2)上述代码中每个功能范围究竟发生了什么?

代码从传递给.each()的函数返回,因此它不会影响封闭函数。

您可以使用$.grep获得更清晰的解决方案。

_editor: function () {
  //retrieve all the editors on the current page
    var editors = window.tinymce.editors;
    var container = this.element;

    return $.grep(editors, function (ed, i) {
        return ed.id == container.id;
    })[0];
}

这基本上是一个过滤器。结果将是您返回truthy值的集合中的项目。所以我们只返回第一个结果(结果的索引0)。