Javascript 变量作用域行为

标签 javascript jquery backbone.js

在我下面的代码中,如果我在函数 __call 中初始化它,我不明白为什么在最终的 console.log 变量 bearer_token 中未定义。

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);
},

最佳答案

两种可能性:

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

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

接下来,我注意到该函数有一个“oauth2_token”字符串。 __call 是异步调用吗?如果是这样,那么它旁边的函数就是回调。当您执行 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);
    });

  });
},

关于Javascript 变量作用域行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23035808/

相关文章:

javascript - 克隆父级 div

javascript - 如何绑定(bind)点击触发器,只绑定(bind)到点击的元素?

javascript - 修改backbone.js中的 View 元素时模型不会改变

javascript - 在同一页面中对数据目标模式使用相同的类

javascript - Backbone.js - 将数据保存到服务器

javascript - JSHint Backbone 未在 CodeKit 中定义

javascript - 在样式表 css 之间切换

javascript - 使用ajax函数将数据存入数据库(web2py框架)

javascript - 2.5/3D世界/街道

javascript - Node Webpack 无法识别 "Import"