返回不在匿名函数内部工作

时间:2014-06-12 10:42:17

标签: javascript

function mapHasStops(callback) {
    app.map.mapObject.getVisibleRegion(function (bounds) {
        for (var i = 0; i < app.map.mapContent.length; i++) {
            (function (i) {
                app.map.mapContent[i].getPosition(function (position) {
                    if (bounds.contains(position)) {
                        callback(true);
                        return;
                    }
                });
            })(i);
        }
    });
}

function updateScreenContent() {
    mapHasStops(function (bool) {
        alert(bool);
    });
}

尽管在成功匹配后立即返回,但alert函数仅被调用一次时,updateScreenContents被多次调用(取决于它找到的匹配项数)。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

修复代码将是:

function mapHasStops(callback) {
    app.map.mapObject.getVisibleRegion(function (bounds) {
        var found = false;
        for (var i = 0; i < app.map.mapContent.length && !found; i++) {
            (function (i) {
                app.map.mapContent[i].getPosition(function (position) {
                    if (bounds.contains(position)) {
                        found = true;
                        callback(true);
                        return;
                    }
                });
            })(i);
        }
    });
}

function updateScreenContent() {
    mapHasStops(function (bool) {
        alert(bool);
    });
}

但是可能有更好的方法来编写这个函数......

答案 1 :(得分:0)

return语句只退出自己的执行上下文,而不是任何外部上下文。在这种情况下,该值将由 getPosition 返回并使用:

    // Enclosing context
    (function (i) {
                                          // Function expression is passed to *getPosition*
                                          // whose return value is not assigned
        app.map.mapContent[i].getPosition(function (position) {
            if (bounds.contains(position)) {
                callback(true);
                return;
            }
        });
    })(i);

因此函数表达式起始function (position)被传递给 getPosition 方法,该方法可能会调用它。它的价值在那里返回并继续做任何事情。它不会再返回。

答案 2 :(得分:-1)

&#34;功能(位置)&#34;传递作为回调函数? 如果是,则for循环不会等待它返回,因此&#34;功能(位置)&#34;被多次打电话。