为什么变量超出范围?

时间:2011-12-02 15:58:59

标签: jquery jquery-mobile

我的代码遇到了一些“奇怪”的问题。它主要是西班牙语,但我相信你会得到。

$('#favoritos').live( 'pagecreate',function(event){
    var favoritos = false;
    var fav_bus = '';
    var fav_bici = '';
    if (!isLocalStorageAvailable()) // Si no hay Local Storage para qué queremos entrar aqui
        $.mobile.changePage('#errorFavoritos', { transition: "pop" });
    else{
        $.each(localStorage, function(index){
            var itemKey = localStorage.key(index);
            if (itemKey.indexOf('fav')){ // Si es un favorito
                var splitted = itemKey.split('-');
                var tipo = splitted[0];
                var numero = splitted[2];
                favs_locales[itemKey] = {
                    'numero' : numero,
                    'id' : itemKey
                };
                if (tipo == 'bus'){
                    favoritos = true;
                    fav_bus = '<div data-role="collapsible>' +
                                '<h3>Parada ' + numero+ '</h3>' +
                                    '<ul data-role="listview" data-inset="true" id="'+itemKey+'">';
                    pedirTiempos(numero).pipe(formatearTiempos).done(function(html){
                        fav_bus += html + '</ul></div>';
                    });
                }
            }
        });
        // Ya tenemos los datos formateados
        console.log(fav_bus);
        if (fav_bus != ''){
            $('#contentFavoritos').append(
                                '<h3 style="text-align: center;">Paradas de Bus</h3>' +
                                    '<div data-role="collapsible-set">' +
                                        fav_bus +
                                    '</div>');
        }
    }
});

这个问题来自于这个功能:

pedirTiempos(numero).pipe(formatearTiempos).done(function (html) {
    fav_bus += html;
});

更改后的fav_bus(在函数中)它没关系,但console.log(fav_bus)就在函数之后,它是错误的。它就像在功能中没有改变一样。

我试图返回html,但它输出的是[Object, object](作为字符串)。

任何提示?

编辑:

我试图将它存储到一个时态DOM元素中,但没关系,但是我无法输出那个HTML(虽然它就在那里)。

pedirTiempos(numero).pipe(formatearTiempos).done(function(html){
        fav_bus += html + '</ul></div>';
        $('#busTemp').html(fav_bus);
});

if ($('#busTemp').length > 0){
   console.log($('#busTemp').html());

并且什么都不输出!

2 个答案:

答案 0 :(得分:1)

从我的代码中可以看出,done看起来像是异步调用。所以你传递给它的函数最有可能在fav_bus += '</ul></div>之后运行。这就是你没有看到变化的原因。

如果您在调用console.log后刚刚传递给done和另一个console.log的函数中放置done,您可能会看到外部console.log 1}}先跑。

要解决此问题,任何后续fav_bus操作都需要在您传递给done的匿名函数内完成。

此外,您无法从异步函数返回任何内容。这就是为什么你需要一个回调,它将对异步结果进行操作。

修改

将代码更改为for..in不应该真正破坏任何内容,除非您明确使用循环索引。您应该可以通过以下更改使其按原样运行:

if (tipo == 'bus') {
    favoritos = true;
    fav_bus = '<div data-role="collapsible>' + '<h3>Parada ' + numero + '</h3>' + '<ul data-role="listview" data-inset="true" id="' + itemKey + '">';
    pedirTiempos(numero).pipe(formatearTiempos).done(function (html) {
        fav_bus += html + '</ul></div>';

        // Ya tenemos los datos formateados
        if (fav_bus != '') {
            $('#contentFavoritos').append('<h3 style="text-align: center;">Paradas de Bus</h3>' + '<div data-role="collapsible-set">' + fav_bus + '</div>');
        }
    });
}

答案 1 :(得分:0)

fav_bus变量是.live函数的本地变量,.done不可见。

将代码移出匿名函数,这与:

相同
function foo() {
   var a = 5;
   bar();
}

function bar() { // "a" is out of scope here.
   a += 5;
}