Javascript 下面的代码片段中'this'的值发生变化的原因是什么?
上面的代码记录Javascript 下面的代码片段中'this'的值发生变化的原因是什么?,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('
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窗口
有意义,因为这是首次调用wrap时,此时其值this
不应设置为obj
/1对象
有意义obj。test
现在等于函数x()
,它将此
正确记录为obj
/2 Window
我不知道为什么会发生这种情况。为什么this
的值没有传播到func()
?我想这个
应该是指函数的所有者。这是否意味着即使在obj内部创建了函数y()
,它还是以某种方式被吊到了窗口
//3窗口
与函数z()类似
为什么此
的值没有从函数x()传下来
。this
的值不应该在那里传播吗?this绑定非常混乱。但是,如果您记住以下规则,就会更容易理解。根据Javascript文档,“this”绑定有四条规则:
wrap.call(窗口,函数(){})
obj.test.call(obj)
y.call(窗口)
z.call(窗口)
这个
不会通过函数声明传播。此
的值完全取决于函数的调用方式
我之所以感到困惑,是因为我太习惯于使用箭头函数,它为您保留了this
的值
// 0 Window
// 1 Object
// 2 Window
// 3 Window
这一点很重要
function wrap(func) {
return () => {
console.log(this)
return () => {
console.log(this)
func()
return () => console.log(this)
}
}
}
并显示您必须显式传递
this
的值。尽管使用箭头函数,但重要的是要注意对func
的调用不会保留this
的值。我需要做func.call(this)
才能做到这一点。我相信既然func
被传递给wrap
函数,它将得到与wrap
函数中的this
相同的值。耶胡达·卡茨就这个主题写了一篇非常好的博客文章:“这是否意味着,即使函数y()是在obj内部创建的”y
没有在obj
中调用,您似乎感到困惑的是,这个
不像一个变量,它不会保留在一个新的作用域中。它在每个新的作用域中由一组规则确定(其他人已经发布了)。之所以1
有this==obj
是因为函数是直接从对象调用的。在其他情况下,this
有一个新的作用域,并且它不是由对象直接调用的,因此上下文默认为window
@AR7return function x(){console.log('1',this)
在obj.test();
function wrap(func) {
var _this = this;
return function () {
console.log(_this);
return function () {
console.log(_this);
func()
return function () {
return console.log(_this);
};
};
};
}