gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:41:41 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com