JavaScript 对象相关的问题,下面代码的输出是什么?

标签 javascript object

var x = 3;
var one = {
  x:2,
  two: {
    x:1,
    three:function(){
        return this.x;
      
    }
  }
}

var go = one.two.three;

 console.log(one.two.three() + "" + go());
 

任何人都可以向我解释为什么输出是 13 为什么不是 1-undefined?

最佳答案

this 关键字具有不同的绑定(bind),可以在运行时更改,具体取决于调用函数的方式。

当函数位于对象上并通过该对象访问时,它的 this 上下文将是该对象(除非另外明确绑定(bind),但稍后我会添加注释)。这意味着 this.x 引用与 one.two.x

相同的变量

当您将同一个函数引用到一个全局变量中时,this 上下文就变成了全局空间(例如浏览器上的 window 对象,或者 globalThis 在 NodeJS 中)。发生这种情况时,this.x 现在正在引用全局变量 x

还有其他一些this上下文规则不同的情况,例如函数闭包或类函数。

函数也有 .bind 方法,它返回一个带有显式绑定(bind)的 this 变量的新函数。

例如:

var x = 3;
var one = {
  x:2,
  two: {
    x:1,
    three:function(){
        return this.x;
      
    }
  }
}

one.two.three = one.two.three.bind(one);

var go = one.two.three;

console.log(one.two.three() + "" + go()); // prints 22

还有箭头函数,它隐式地将 this 上下文绑定(bind)到它的词法范围...例如:

var x = 3;
var one = {
  x:2,
  two: {
    x:1,
    three: () => {
        return this.x;

    }
  }
}


var go = one.two.three;

console.log(one.two.three() + "" + go()); // prints 33

上面的例子打印 33,因为词法作用域是全局作用域,因此 this.x 引用了全局变量 x

希望这能在不产生更多问题的情况下回答您的问题。

进一步阅读:

关于JavaScript 对象相关的问题,下面代码的输出是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71045035/

相关文章:

javascript - 什么 JavaScript 概念允许相同的名称既是函数又是对象?

java - 使用 Java comparable 按名称对对象进行排序

具有缓存层的 Java 对象引用

javascript - 有哪些好的纯 JavaScript 教程和引用资料?

javascript - 可滚动元素中的下拉菜单

javascript - 查询 :visible selector does not give proper output

jquery - 重构数据对象上的 jQuery 每个循环

javascript - 嵌套数组的函数式编程

android - 可打包的 ArrayList (Android)

c++ - 在各自的线程上运行多个对象似乎多次运行同一个对象