在javascript中从函数返回数组
所以我来自一个很有python背景的人,我正试图用javascript来表达我的想法。这里我有一个函数,返回艺术家“v-2-followers”的soundcloud歌曲的曲目ID数组。如何将SC.get(stuff)的输出分配给一个变量,以便在另一个函数中重用跟踪列表。我肯定我错过了一些基本的东西。我不是在寻找一个解释如何做到这一点的答案,而是在寻找为什么这样做 也就是说,我也非常感谢您的帮助。:)在javascript中从函数返回数组,javascript,scope,variable-assignment,soundcloud,Javascript,Scope,Variable Assignment,Soundcloud,所以我来自一个很有python背景的人,我正试图用javascript来表达我的想法。这里我有一个函数,返回艺术家“v-2-followers”的soundcloud歌曲的曲目ID数组。如何将SC.get(stuff)的输出分配给一个变量,以便在另一个函数中重用跟踪列表。我肯定我错过了一些基本的东西。我不是在寻找一个解释如何做到这一点的答案,而是在寻找为什么这样做 也就是说,我也非常感谢您的帮助。:) 我可以看出我缺少了一些关于变量赋值和作用域,或者函数回调的基本信息。我已经精疲力竭地浏览了有关
我可以看出我缺少了一些关于变量赋值和作用域,或者函数回调的基本信息。我已经精疲力竭地浏览了有关这个问题的文件。如果有人能告诉我怎么做,更重要的是,为什么这样做,以供将来参考。您将
trackIdList
作为全局变量,因为它不是使用var
创建的。因此,您可以从任何其他函数访问它。如果您想将其范围仅限于外部函数,请添加var trackIdList代码>作为函数的第一行。您应该到处使用var
声明变量,以限制其范围
(function() {
var trackIdList;
...
})();
进一步阅读:
您需要了解的另一个概念是关于JavaScript中的异步执行和回调。填充trackIdList
的代码包含在回调函数中,该函数很可能在调用SC.stream()
后调用。如果SC.stream()
依赖于trackIdList
的值,则应从回调函数调用它
分离回调函数可能有助于说明发生了什么
(function () {
var trackIdList = [];
SC.initialize({
client_id: '__CLIENTID__'
});
SC.get('/tracks', { q: 'v-2-followers' }, processTracks);
var randomIndex = Math.floor(Math.random() * myArray.length);
SC.stream('/tracks/' + trackIdList[randomIndex], processSound);
function processTracks(tracks) {
tracks.forEach(function (track) {
trackIdList.push(track.id);
});
}
function processSound(sound) {
sound.play();
sound.pause();
$('#fabrizio').hover(function (e) {
sound.resume();
}, function (e) {
sound.pause();
});
}
})();
SC.get()
发出异步请求并立即返回。然后调用SC.stream()
,而不等待请求返回<在请求返回之前,不会调用code>processTracks()
。问题在于SC.stream()
依赖于processTracks()
,但会立即调用。要解决此问题,请从SC.get()
的回调函数调用SC.stream()
:
您将
trackIdList
作为全局变量,因为它不是使用var
创建的。因此,您可以从任何其他函数访问它。如果您想将其范围仅限于外部函数,请添加var trackIdList代码>作为函数的第一行。您应该到处使用var
声明变量,以限制其范围
(function() {
var trackIdList;
...
})();
进一步阅读:
您需要了解的另一个概念是关于JavaScript中的异步执行和回调。填充trackIdList
的代码包含在回调函数中,该函数很可能在调用SC.stream()
后调用。如果SC.stream()
依赖于trackIdList
的值,则应从回调函数调用它
分离回调函数可能有助于说明发生了什么
(function () {
var trackIdList = [];
SC.initialize({
client_id: '__CLIENTID__'
});
SC.get('/tracks', { q: 'v-2-followers' }, processTracks);
var randomIndex = Math.floor(Math.random() * myArray.length);
SC.stream('/tracks/' + trackIdList[randomIndex], processSound);
function processTracks(tracks) {
tracks.forEach(function (track) {
trackIdList.push(track.id);
});
}
function processSound(sound) {
sound.play();
sound.pause();
$('#fabrizio').hover(function (e) {
sound.resume();
}, function (e) {
sound.pause();
});
}
})();
SC.get()
发出异步请求并立即返回。然后调用SC.stream()
,而不等待请求返回<在请求返回之前,不会调用code>processTracks()
。问题在于SC.stream()
依赖于processTracks()
,但会立即调用。要解决此问题,请从SC.get()
的回调函数调用SC.stream()
:
我会用一种方式解释——回调。人们这样做的原因是有同步操作和异步操作。在您的情况下,您需要执行一个AJAX请求—我们不知道完成
SC.get
需要多长时间,我们也不希望程序在等待时挂起。因此,我们不再等待,而是告诉它“去获取那些曲目,我将向您传递一个函数,在您完成后调用。同时,我将继续执行程序的其余部分。”
我会用一种方式解释——回调。人们这样做的原因是有同步操作和异步操作。在您的情况下,您需要执行一个AJAX请求—我们不知道完成
SC.get
需要多长时间,我们也不希望程序在等待时挂起。因此,我们不再等待,而是告诉它“去获取那些曲目,我将向您传递一个函数,在您完成后调用。同时,我将继续执行程序的其余部分。”
如果没有var,它意味着“这个范围”,在web的情况下是窗口(或全局),在节点中是当前文件的范围。按照gilly3的建议,将它包装在闭包(函数)的范围内是一个好的做法&保持范围更整洁。我明白了,因为myVar是全局初始化的,如果我在函数中更改它的值,它是myVar=myValue,仅在该函数内部。因此,当我用下一个函数调用它时,它会查找下一个作用域,它是全局的,其中myVar等于它初始化时所做的任何事情。。全球地。我明白你的意思了,在调用任何异步函数之前,我需要准备好异步函数所需的任何输入。回想起来,这似乎很明显。全局声明的变量当然可以在函数中重新赋值。现在,函数可以有一个与作用域更大的变量名称相同的变量。这是通过使用
var
关键字在函数中声明变量来实现的。它有效地对函数隐藏了范围更大的变量。听起来您好像是在执行回调并填充变量之前读取变量。@askthewolves-我编辑了我的答案,以详细说明异步方面,这听起来像是您的源代码
(function() {
SC.initialize({
client_id:'__CLIENTID__'
});
var getTracks = function(callback) {
SC.get('/tracks', { q: 'v-2-followers' }, function(tracks) {
trackIdList = [];
tracks.forEach(function(track){
trackIdList.push(track.id);
});
callback(trackIdList);
});
}
// And use the variable here.
var stream = function(trackIdList) {
SC.stream('/tracks/'+trackIdList[Math.floor(Math.random() * myArray.length)], function(sound) {
sound.play();
sound.pause();
$('#fabrizio').hover(function(e){
sound.resume();
}, function(e){
sound.pause();
});
});
}
getTracks(stream);
})();