You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript嵌套对象与闭包中this关键字的疑问及理解求证

JavaScript中this绑定的两个问题解答

问题1:为什么控制台输出Window对象?

对应的代码:

const obj = {
  name: "Cristiano",
  lname: "Ronaldo",
  getName: function () {
    function another() {
      console.log(this);
    }
    another();
  },
};

obj.getName();

普通函数的this是动态绑定的,完全由函数的调用方式决定:

  • 当你执行obj.getName()时,getName作为obj的方法被调用,所以getName内部的this指向obj。
  • 但内部的another是独立的普通函数,你直接以another()的形式调用它(没有通过对象挂载、call/apply/bind指定绑定对象),在非严格模式下,这种默认调用的this会绑定到全局对象——浏览器环境中就是Window。

如果想让another的this指向obj,可以改用another.call(this)、another.bind(this)(),或者把another改成箭头函数。

问题2:你的理解正确吗?

对应的代码:

const obj = {
  name: "Cristiano",
  lname: "Ronaldo",
  moreObj: {
    name: "Siiii",
    getName: function () {
      const named = () => this.name;
      console.log(named());
    },
  },
};

obj.moreObj.getName();

你的理解是正确的,这段代码确实会输出Siiii,再补充一点细节帮你巩固:

  • getName是普通函数,作为moreObj的方法调用,所以getName内部的this指向moreObj。
  • 箭头函数的this是词法绑定,它不会自己绑定this,而是直接继承外层作用域(这里就是getName的作用域)的this值,所以named里的this就是moreObj,this.name自然就是moreObj.name,也就是Siiii。

内容的提问来源于stack exchange,提问作者Aryan Shridhar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:30:49