_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)上述代码中每个功能范围究竟发生了什么?
谢谢。
答案 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;
语句在for
或while
循环中。
答案 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
)。