js 变量作用域

2015-05-22 14:28:26 +08:00
 whatisnew

怎么让 ajax 请求返回:

var class = {
  method: function(q) {
    var data = null;
    $.get('api/get', q, function(data) {
      // 这里的 return 貌似只返回到了 method
      return data;
    });
    // 这里的 return 没有得到赋值。。。
    return data;
  },
};

// return null...
console.log(class.method({q:'q'}));
2452 次点击
所在节点    JavaScript
8 条回复
lion9527
2015-05-22 14:31:12 +08:00
“var data = null;” 去掉“var”试试?
chairuosen
2015-05-22 14:34:28 +08:00
-method:function(q){
+method:function(q,callback){

-$.get('api/get', q, function(data) {});
+$.get('api/get', q, callback);

class.method({q:'q'},function(data){
console.log(data)
})
zhujinliang
2015-05-22 14:38:41 +08:00
这个跟作用域没关系
method中调用$.get,将一个匿名函数传递给$.get,此时该函数并未被执行,而是继续走到了return data 此时函数class.method返回null。
当ajax获取数据后,之前传递给$.get的函数才会被调用,但此时已与之前的class.method函数调用没有关系了。
如果想得到ajax返回的数据,只能依次使用回调。

比如这样:
var class = {
method: function(q, fn) {
//var data = null;
$.get('api/get', q, function(data) {
fn(data);
});
//return data;
},
};

class.method({q:'q'}, function(data){ console.log(data); });
jarlyyn
2015-05-22 14:41:45 +08:00
这里牵涉到一个异步和一个作用域的问题。
如果对异步不熟悉的话,可以考虑看下async库。
另外,jquery中的ajax现在应该本身也有类似promise的实现。
iamppz
2015-05-22 14:44:09 +08:00
jQuery可以考虑下deferred对象:
function method(q) {
var dfd = $.Deferred();
$.get('api/get', q).done(function (data) {
dfd.resolve(data);
}).fail(function () {
dfd.reject();
});
return dfd.promise();
}

method.done(function(data){ console.log(data); })
sneezry
2015-05-22 14:49:44 +08:00
恭喜解锁成就,入了回调的坑。
nilennoct
2015-05-22 16:53:13 +08:00
$.get('api/get', q, function(data) {
// 这里的 return 貌似只返回到了 method
return data;
});
return data;

你从代码执行的角度看,function (data) {...} 其实只是传进$.get()的一个参数而已,执行完$.get()后,自然就return data了,至于你传进去的function (data) {...} (又称回调函数)在什么时候执行,取决于你的接口什么时候返回数据。
jyootai
2015-05-22 18:00:20 +08:00
恭喜入异步的坑,不过能意识到这点走到这一步,表示离光明不远了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/192983

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX