0

この JavaScript コードに問題があります。(tracking_data) の 2 番目のアラートは、変数が削除またはクリアされた場合のように「未定義」をスローし、コードのどの部分もそれを実行していません。これで私を助けてくれることを願っています。よろしく。

var track_id = '';      // Name/ID of the exercise
var watch_id = null;    // ID of the geolocation
var tracking_data = []; // Array containing GPS position objects

$("#startTracking_start").live('click', function () {

// Start tracking the User
watch_id = navigator.geolocation.watchPosition(

    // Success
    function (position) {
        tracking_data.push(position);
        alert(tracking_data);
    },

    // Error
    function (error) {
        console.log(error);
    },

    // Settings
        {frequency: 3000, enableHighAccuracy: true });

    // Tidy up the UI
    track_id = $("#track_id").val();

    $("#track_id").hide();

    $("#startTracking_status").html("Tracking workout: <strong>" + track_id + "</strong>");
});


$("#startTracking_stop").live('click', function(){
    alert(tracking_data);

// Stop tracking the user
navigator.geolocation.clearWatch(watch_id);

// Save the tracking data
window.localStorage.setItem(track_id, JSON.stringify(tracking_data));

// Reset watch_id and tracking_data 
var watch_id = null;
var tracking_data = null;

// Tidy up the UI
$("#track_id").val("").show();

$("#startTracking_status").html("Stopped tracking workout: <strong>" + track_id + "    </strong>");

});
4

2 に答える 2

1

を使用して、クリック コールバックvar tracking_data = nulltracking_dataローカルにします。tracking_data外側のスコープからは同じではありません。JavaScript の変数と関数の巻き上げにより、変数の宣言は関数の最初で行われ、 に設定さtracking_dataundefinedます。

その行var(およびその前の行) を削除すると、コードは意図したとおりに動作するはずです。

于 2013-07-13T04:21:29.760 に答える
1

巻き上げのため、すべての var 宣言はそれを囲む関数の先頭に移動されます。つまり、関数内でオーバーライドしていtracking_dataます。

var tracking_data = null;(関数内)からに変更tracking_data = null;すると、問題が解決します。

以下の例は、この動作を再現しています。

var v1 = 'hello';
(function(){
  console.log(v1); //prints hello
  v1 = 'hi';
  console.log(v1); //prints hi
})()

.

var v2 = 'hello';
(function(){
  console.log(v2); //prints undefined. Due to hoisting the var v2 was overriden inside this scope. 
  var v2 = 'hi';
  console.log(v2); //prints hi
})()
于 2013-07-13T04:21:31.827 に答える