javascript - 为什么这是指外部变量?

标签 javascript json object

<分区>

这应该引用对象本身,但在下面的代码中,为什么它的行为不同?

var x   = 4,
    obj = {
        x: 3,
        bar: function() {
            var x = 2;
            setTimeout(function() {
                var x = 1;
                alert(this.x);
            }, 1000);
        }
    };
obj.bar();

为什么警报是 4 而不是 3

最佳答案

内部 setTimeout 回调 this 引用窗口对象,因此它正在检索在全局上下文中定义的变量。

您可以通过使用 Function#bind 绑定(bind) this 上下文来使其工作 方法。

var x = 4,
  obj = {
    x: 3,
    bar: function() {
      var x = 2;
      setTimeout(function() {
        var x = 1;
        alert(this.x);
      }.bind(this), 1000);
    }
  };
obj.bar();


或者使用局部变量来缓存对 this 的引用并在回调函数中使用它。

var x = 4,
  obj = {
    x: 3,
    bar: function() {
      var x = 2,
        that = this;
      setTimeout(function() {
        var x = 1;
        alert(that.x);
      }, 1000);
    }
  };
obj.bar();


另请参阅 MDN 文档:The "this" problem

关于javascript - 为什么这是指外部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37760720/

相关文章:

多种数据类型的对象

javascript - 如何获取没有页面的url

javascript - 使用 AJAX 将 JSON 转换为 PHP

javascript - 获取 omdb api 前 100 部电影?

ios - 如何使用 Swifty Json 将 POST 请求中的 JSON 数据保存到字典中?

object - Treeview 中的返回对象导致 "Maximum call stack size exceeded"Vuetify

javascript - 如何在字符串上使用 eval() 获取对象值

javascript - 创建动态对象组

javascript - Handlebars 模板未定义

javascript - 如何使用 JS 验证元素是否存在于表单中