Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中从函数返回数组_Javascript_Scope_Variable Assignment_Soundcloud - Fatal编程技术网

在javascript中从函数返回数组

在javascript中从函数返回数组,javascript,scope,variable-assignment,soundcloud,Javascript,Scope,Variable Assignment,Soundcloud,所以我来自一个很有python背景的人,我正试图用javascript来表达我的想法。这里我有一个函数,返回艺术家“v-2-followers”的soundcloud歌曲的曲目ID数组。如何将SC.get(stuff)的输出分配给一个变量,以便在另一个函数中重用跟踪列表。我肯定我错过了一些基本的东西。我不是在寻找一个解释如何做到这一点的答案,而是在寻找为什么这样做 也就是说,我也非常感谢您的帮助。:) 我可以看出我缺少了一些关于变量赋值和作用域,或者函数回调的基本信息。我已经精疲力竭地浏览了有关

所以我来自一个很有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);
 })();