簡體   English   中英

將函數作為變量調用

[英]Calling a function as a variable

我現在只花了一兩個小時就可以看到一小段代碼,但是似乎無法弄清楚為什么我的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]);

    });
});

我在頂部添加了一些上下文變量。 為了解釋該功能,將我指定的數組的兩個部分傳遞到了控制台中,這是完美的。 只有當我調用變量時,它才會顯示為未定義嗎?

我還嘗試將其包裝在其他函數中,因此沒有運氣。

有人知道我哪里出錯了嗎?

您正在調用兩個異步函數。 您在第二個中獲得的結果僅在該回調函數中或在您從那里調用的函數中有效。 之后,您將無法在全局范圍內使用它們,因為異步功能尚未完成,因此它們仍未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函數,則似乎它什么也不返回,因此這就是idGetter undefined

僅供參考,我在SoundCloud源代碼中確認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
});

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()來運行該函數。

我只能假設userInfo[2]顯示為undefined,因為userInfo是undefined不會顯示。 如果真是這樣,那么很有可能user.public_favorites_count是未定義的。 嘗試將其打印到控制台上,並在其顯示為未定義狀態時,您需要確定發生這種情況的原因。 如果沒有有關該對象是什么或返回該對象的代碼的更多信息,社區將無法提供更多幫助。

這似乎是行之有效的,或者是向前邁出的一步。

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

在函數前設置變量,然后在函數后重新設置。 不確定這是否是標准做法,但似乎在一定程度上可行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM