Javascript全局数组未定义

时间:2013-07-13 04:15:57

标签: javascript arrays variables

我遇到这个javascript代码的问题,(tracking_data)的第二个警告会抛出'undefined',就像变量被删除或清除一样,我没有看到代码的任何部分这样做。我希望你能帮助我。问候。

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>");

});

2 个答案:

答案 0 :(得分:1)

通过使用var tracking_data = null,您可以在点击回调中设置tracking_data本地。它与外部范围不同tracking_data。由于JavaScript的变量和函数提升,变量声明在函数的最开始处完成,这将tracking_data设置为undefined

摆脱var并在该行(及其前面的行)上删除,您的代码应按预期工作。

答案 1 :(得分: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
})()