javascript - 以下代码片段中 `this` 值变化的解释?

标签 javascript this

function wrap(func) {
  console.log('0', this)
  return function x() {
    console.log('1', this)
    func()
    return function z() {
      console.log('3', this)
    }
  }
}

var obj = {
  x: 5,
  test: wrap(function y() {
    console.log('2', this)
  })
}

obj.test()()

上面的代码记录

// 0 Window
// 1 Object
// 2 Window
// 3 Window

我无法理解什么决定了 this 的值应该是什么。

//0 Window 是有道理的,因为这是第一次调用 wrap 的时候,此时它的值 this 不应设置为 obj

//1 Object 有意义 obj.test 现在等于 function x(),它正确地记录了 this 作为 obj

//2 Window 我不确定为什么会这样。为什么 this 的值不会传播到 func()?我认为 this 应该是指函数的所有者。这是否意味着即使 function y() 是在 obj 内部创建的,它也会以某种方式被提升到窗口?

//3 Window 同样 function z(​​) 为什么 this 的值没有从 function x( )this 的值不应该在那里传播吗?

最佳答案

'this' 绑定(bind)非常困惑。但是,如果您记住以下这些规则,就会更容易理解。根据 Javascript 文档,“this”绑定(bind)的顺序有四个规则:

  1. 新运营商
  2. 通过调用或应用方法进行显式或硬绑定(bind)
  3. 与包含对象的隐式绑定(bind),如对象的方法
  4. 默认(全局)

在您的脚本中,只有规则 #3 和 #4 适用,因为没有新的运算符和 call 或 apply 方法。

所以解释是:

//0 窗口 - 规则 #4 默认(全局)

//1 对象 - 规则 #3 与包含对象的隐式绑定(bind),如对象的方法,在您的情况下为 obj.test

//2 窗口 - 规则 #4 默认(全局)

//3 窗口 - 规则 #4 默认(全局)

关于javascript - 以下代码片段中 `this` 值变化的解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36586336/

相关文章:

javascript - MySql:字符串变成对象?奇怪的行为

javascript - 使用 javascript 使用排序函数而不使用 lambda 函数

String.prototype.replace 函数中的 Javascript 'this' 关键字

javascript - This 关键字在这种情况下适用于什么

javascript 对象原型(prototype) this 引用

javascript - 在 JavaScript 中临时修改对象实例的方法和属性

javascript - Angular : ng-if and ng-repeat not working after custom transclusion

javascript - 从实用程序文件访问 cc.Director 成员和函数

javascript - 如何使用 Javascript 而不是 jQuery 为 window.scrollTo 设置动画?

javascript - 在没有 "Possible strict violation."的函数中使用它