将函数称为变量

时间:2015-05-06 22:03:08

标签: javascript function

我现在已经花费了一小时或两小时的代码片段,但似乎无法弄清楚为什么我的Javascript会在此代码的末尾出现故障。

// Getting username from address bar and user ID from username
var siteHref = window.location.href;
var specifiedUser = siteHref.split('#');
var userName = specifiedUser[1];
var userURL = 'http://soundcloud.com/' + userName;

var idGetter = SC.get('/resolve', { url: userURL }, function(user) {
     SC.get('/users/', function() {

     var userInfo = new Array(3);
        userInfo[0] = user.username;
        userInfo[1] = user.id;
        userInfo[2] = user.public_favorites_count;

        console.log(userInfo);
        console.log(userInfo[2]);

    });
});

我已经在顶部添加了变量以获取一些上下文。为了解释这个函数,我将指定的数组的两个部分传递给控制台,这是完美的。只有当我调用变量时才显示为未定义?

我还尝试将其包装在一个附加功能中,并且没有运气称它。

任何人都知道我哪里出错了?

4 个答案:

答案 0 :(得分:2)

您正在调用两个异步函数。您在第二个结果中获得的结果仅在该回调函数内或您从那里调用的函数中有效。之后您无法全局使用它们,因为异步函数尚未完成,因此它们仍然是undefined

另外,如果您询问userInfo变量,一旦回调返回就超出范围,因此在其他任何地方都无法使用。

请参阅我在您的代码中添加的评论:

// Getting username from address bar and user ID from username
  var siteHref = window.location.href;
  var specifiedUser = siteHref.split('#');
  var userName = specifiedUser[1];
  var userURL = 'http://soundcloud.com/' + userName;

  var idGetter = SC.get('/resolve', { url: userURL }, function(user) {
      SC.get('/users/', function() {

       var userInfo = new Array(3);
          userInfo[0] = user.username;
          userInfo[1] = user.id;
          userInfo[2] = user.public_favorites_count;

          console.log(userInfo);
          console.log(userInfo[2]);

          // ** you must use userInfo here or call some other function
          // ** and pass userInfo to it

      });
  });

  // ** you cannot use userInfo here as it is both out of scope and
  // ** has not yet been set

idGetter值将包含对SC.get()的第一次调用返回的内容,这不会是最终的异步结果。如果您告诉我们SC.get()是什么,那么我们可能会帮助您了解它返回的内容。

如果SC.get()是SoundCloud函数,那么它似乎没有返回任何内容,这就是idGetterundefined的原因。

仅供参考,我确认here in the SoundCloud source SC.get()没有返回任何内容。

如果你要做的就是创建一个包含所有这些代码的新函数,并在结果可用时调用回调,你可以定义该函数然后调用它:

function getUserInfo(callback) {

    // Getting username from address bar and user ID from username
      var siteHref = window.location.href;
      var specifiedUser = siteHref.split('#');
      var userName = specifiedUser[1];
      var userURL = 'http://soundcloud.com/' + userName;

      SC.get('/resolve', { url: userURL }, function(user) {
          SC.get('/users/', function() {

           var userInfo = new Array(3);
              userInfo[0] = user.username;
              userInfo[1] = user.id;
              userInfo[2] = user.public_favorites_count;

              console.log(userInfo);
              console.log(userInfo[2]);

              // ** you must use userInfo here or call some other function
              // ** and pass userInfo to it
              callback(userInfo);

          });
      });

      // ** you cannot use userInfo here as it is both out of scope and
      // ** has not yet been set
}

// then, you can call it like this:
getUserInfo(function(userData) {
    // you can use userData here
});

答案 1 :(得分:0)

idGetter不是函数,你不能调用它。如果您希望它是一个函数,请写:

var idGetter = function () {
    SC.get('/resolve', { url: userURL }, function(user) {
        SC.get('/users/', function() {

            var userInfo = new Array(3);
            userInfo[0] = user.username;
            userInfo[1] = user.id;
            userInfo[2] = user.public_favorites_count;

            console.log(userInfo);
            console.log(userInfo[2]);

        });
    });
};

然后你可以idGetter()来运行这个功能。

答案 2 :(得分:0)

我只能假设userInfo[2]显示为未定义,因为它不会生成,因为userInfo未定义。如果是这种情况,那么很可能user.public_favorites_count未定义。尝试将其打印到控制台,当它显示为未定义时,您需要确定为什么会发生这种情况。如果没有关于该对象是什么的更多信息,或者返回该对象的代码,社区将无法提供更多帮助。

答案 3 :(得分:0)

这似乎要么有效,要么向前迈出一步。

var idGetter = function () { SC.get('/resolve', { url: userURL }, function(user) {
      SC.get('/users/', function() {

       var userInfo = new Array(3);
          userInfo[0] = user.username;
          userInfo[1] = user.id;
          userInfo[2] = user.public_favorites_count;

          console.log(userInfo);
          console.log(userInfo[2]);

      });
  });
};

var idGetter = idGetter();

在功能之前设置变量,然后重新设置。不确定这是否是标准做法,但似乎在某种程度上有效。