在函数中更改后,Javascript全局变量仍为“未定义”

时间:2014-03-05 11:31:58

标签: javascript scope

我试图制作一个JS剧本,从YouTube频道获取最后一个视频。我想从每个视频中获取标题,ID和缩略图,以便在我的页面中使用它们。我的第一个选择是创建一个包含所有视频的全局数组,以便在其他函数中使用它(createThumbnail,createPlayer ...)。这是我拍摄频道最新视频的代码:

user = 'PiewDiePie'

var videos = [];

$.getJSON('http://gdata.youtube.com/feeds/users/' + user + '/uploads?alt=json-in-script&format=5&callback=?', null, function(data) {
    var feed = data.feed;
    $.each(feed.entry, function(i, entry) {
        var video = {
            title: entry.title.$t,
            id: entry.id.$t.match('[^/]*$'),
            thumbnails: entry.media$group.media$thumbnail
        };
        videos.push(video);
    });
    alert('Inside function: ' + videos[0].title);
});

alert('Outside function: ' + videos[0].title);

// Functions with the videos array

这里的问题是第一个警报显示标题,但第二个警告显示以下错误:

Uncaught TypeError: Cannot read property 'title' of undefined

最后,我改变了我的脚本,避免使用全局范围变量,但我无法理解为什么这不起作用。我是javascript的新手,可能这对专家来说很明显......

非常感谢

1 个答案:

答案 0 :(得分:1)

你的问题是按时间顺序排列的。

您对YouTube API的请求是异步,这意味着在您的代码继续执行后,其余代码将会发生。因此,当您的第二个警报触发时,请求尚未完成,因此videos数组尚未填充。

相反,您的第二个警报需要等待请求解决。

更改

$.getJSON(...

var req = $.getJSON(....

然后将第二个警报包裹在请求的回调中

req.done(function() { alert('Outside function: ' + videos[0].title); });