0

.push() データをオブジェクトとして配列に返す別の関数を (条件が true の場合) 呼び出すループを持つ関数があります。何が起こっているかというと、2 番目の関数への最初の呼び出しの後、最初の関数からのループが停止し、コードがコードの次の部分に移動することです (Chrome コンソールにエラーはなく、正しいオブジェクトがプッシュされます)。何が問題ですか?

最初の関数:

    if (window.localStorage.length > 1) {
        track_items_for_chart = [];
        for (i = 0; i < window.localStorage.length; i++) {
            console.log(i);
            var key_name = (window.localStorage).key(i);
            var record_time = (window.localStorage.getItem(key_name));
            if (record_time !== '[]') {
                console.log("record_time !== '[]'");
                if (key_name !== 'exp') {
                    console.log("key_name !== 'exp'");
                    if (key_name !== 'ripple-last-load') {
                        console.log("key_name !== 'ripple-last-load'");
                var computed_info = get_total_km(key_name);
                    }

                }


            }
        }

2 番目の関数:

function get_total_km($object_key) {

    // Get all the GPS data for the specific workout
    var data = window.localStorage.getItem($object_key);

    // Turn the stringified GPS data back into a JS object
    data = jQuery.parseJSON(data);
    if (data) {
        // Calculate the total distance travelled
        total_km = 0;
        for (i = 0; i < data.length; i++) {

            if (i === (data.length - 1)) {
                break;
            }

            total_km += gps_distance(data[i].coords.latitude, data[i].coords.longitude, data[i + 1].coords.latitude, data[i + 1].coords.longitude);
        }

        total_km_rounded = parseFloat(total_km.toFixed(2));
        // Calculate the total time taken for the track
        start_time = new Date(data[0].timestamp).getTime();
        end_time = new Date(data[data.length - 1].timestamp).getTime();
        total_time_ms = end_time - start_time;
        total_time_s = total_time_ms / 1000;
        final_time_m = Math.floor(total_time_s / 60);
        final_time_s = Math.floor(total_time_s - (final_time_m * 60));
//        console.log({total_km_rounded: total_km_rounded, final_time_m: final_time_m, final_time_s: final_time_s});
        var time_mas = parseFloat(final_time_m + "." + final_time_s);
        track_items_for_chart.push(total_km_rounded, time_mas);
    }
}
4

1 に答える 1

1

for( var i =0)両方の機能で開始する。別の言語を使用していた場合、これは少し混乱しますが、JS はすべての i (var で定義するまで) を同じ引数として示します。したがって、2 番目の関数の実行後、i はすでに localstorage の長さよりも大きくなっています。

JS 引数のスコープについて詳しく読む必要があります。

たぶんここから始めてください: JavaScript の変数のスコープとは?

于 2013-11-08T06:12:18.810 に答える