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)的顺序有四个规则:
- 新运营商
- 通过调用或应用方法进行显式或硬绑定(bind)
- 与包含对象的隐式绑定(bind),如对象的方法
- 默认(全局)
在您的脚本中,只有规则 #3 和 #4 适用,因为没有新的运算符和 call 或 apply 方法。
所以解释是:
//0 窗口 - 规则 #4 默认(全局)
//1 对象 - 规则 #3 与包含对象的隐式绑定(bind),如对象的方法,在您的情况下为 obj.test
//2 窗口 - 规则 #4 默认(全局)
//3 窗口 - 规则 #4 默认(全局)
关于javascript - 以下代码片段中 `this` 值变化的解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36586336/