Javascript 将函数作为变量调用
我已经花了一两个小时研究了一小段代码,但似乎不明白为什么我的Javascript在代码末尾出现故障Javascript 将函数作为变量调用,javascript,function,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://soun
// 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]);
});
});
我在顶部添加了一些变量,以供参考。为了解释这个函数,将我指定的数组的两个部分传递到控制台中,这非常完美。只有当我调用变量时,它才显示为未定义 我还尝试将其包装到一个附加函数中,但没有成功调用它
有人知道我哪里出错了吗?您正在调用两个异步函数。在第二个函数中得到的结果仅在回调函数内部或从那里调用的函数中有效。之后不能全局使用它们,因为异步函数尚未完成,因此它们仍然是未定义的 另外,如果您询问的是
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()
仅供参考,我确认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]
显示为未定义,因为它不会使userInfo
未定义。如果是这种情况,则可能未定义user.public\u favorites\u 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();
在函数之前设置变量,在函数之后重新设置。不确定这是否是标准做法,但似乎在某种程度上起作用。“仅当我调用变量时,is显示为未定义?”您能详细说明吗?什么变量是未定义的?在这两个值登录到控制台之后,您什么时候检查它?代码中的什么地方没有定义。我调用idGetter并得到一个错误,说idGetter未定义。idGetter难道不只是重新运行该函数并再次给出这两个值吗?@jermainecraig能否将这行代码添加到您的示例中以清晰明了?@jermainecraigSC.get()
可能不会返回任何内容,默认为未定义的,这就是分配给idGetter
的内容。实际上,我并没有试图调用userInfo,而是调用idGetter。@jermainecraig-idGetter包含您的第一个SC.get()
调用返回的不是最终收集的异步结果。如果您告诉我们什么是SC.get()
,那么我们也许可以帮助您理解它返回的内容。@jermainecraig-请参阅我在回答末尾添加的关于SC.get()
的信息。我想问题可能不在这段代码之外,因为我尝试了这一点,但它正在将函数返回到控制台,而不是函数的实际输出?这是我应该期待的吗。对不起,完全是新手。好吧,问题是idGetter();作为一个函数调用,返回的正是我所需要的,但作为变量调用的idGetter却没有,我是否期望这样?这个解决方案有什么用?它所做的只是将其封装在另一个函数中,而这个函数并不能解决任何特定的问题——它只是创建了一个新的外部函数。我不明白这解决了什么问题,或者OP实际上遇到了什么问题。@jermainecraig如果SC.get
返回一个函数,然后将其分配给idGetter
使其成为一个函数,那么您需要将其作为函数调用。@jermainecraig如果我们知道SC.get
是什么,它可能会有所帮助。这是第三方图书馆的一部分吗?