Javascript变量范围行为

时间:2014-04-12 20:32:20

标签: javascript jquery backbone.js

在下面的代码中我不明白为什么在最终的console.log变量bearer_token是未定义的,如果我在函数__call中对其进行了对齐。

home: function () {
  var bearer_token;
  var cb = new Codebird;
  cb.setConsumerKey("Zox*O8n1u", "zaCTe5oI23bxx***CG87e8hkgZgBeIHV7LKp");
  cb.__call(
    "oauth2_token", {},
    function (reply) {
      var bearer_token = reply.access_token;
    }
  );
  $.ajax({
    url: "http://search.twitter.com/search.json?q=felpone",
    dataType: "jsonp",
    jsonpCallback: "myFunction",
    beforeSend: function (xhr, settings) {
      xhr.setRequestHeader('Authorization', 'Bearer ' + bearer_token);
    }
  });

  function myFunction(r) {
    console.log(r);
  }
  console.log(bearer_token);
},

2 个答案:

答案 0 :(得分:4)

两种可能性:

function (reply) {
  var bearer_token = reply.access_token;
}

这段代码将reply.access_token分配给该函数中的bearer_token ,而不是函数外部的bearer_token 。这意味着如果该代码运行,它不会影响外部var。为此,请移除__call

接下来,我注意到该函数有一个“oauth2_token”字符串。 console.log(bearer_token)是异步调用吗?如果是这样,那么它旁边的那个函数就是回调。当你home: function () { var cb = new Codebird; cb.setConsumerKey("Zox*O8n1u", "zaCTe5oI23bxx***CG87e8hkgZgBeIHV7LKp"); cb.__call("oauth2_token", {}, function (reply) { var bearer_token = reply.access_token; console.log(bearer_token); $.ajax({ url: "http://search.twitter.com/search.json?q=felpone", dataType: "jsonp", beforeSend: function (xhr, settings) { xhr.setRequestHeader('Authorization', 'Bearer ' + bearer_token); } }).done(function (data) { console.log(data); }); }); }, 时,响应可能尚未到来。要在异步操作的响应返回后执行代码,请将响应到达回调后应运行的所有代码放在其中。

这应该有效:

{{1}}

答案 1 :(得分:0)

您已在__call范围内创建了一个新变量bearer_token。删除var。