理解一下this的困惑

一般用来解释this的例子是根据
var foo=function(){
console.log(this.name)
}

obj={
name:'内部',
print:foo
}

直接调用
1 执行方式 foo()
打印undefined,由于直接调用时 this 指向window,全局未定义name 因此打印undefined
2 执行方式 obj.print()
打印 '内部',由于这种方式调用时,this指向的是obj对象,obj内定义了name属性,因此打印出内部

上面的解释结束了。
假如代码是这个样子的,会如何执行

var foo=function(){
this.name='方法'
console.log(this.name)
}

obj={
name:'内部',
print:foo
}

仍是两种方式调用
foo() 打印 ‘方法’;以下图,由于直接调用时,this指向的window,
至关于给全局环境定义了name属性,因此,console.log(this.name);打印出全局的变量name


obj.print() 打印 ‘方法’;以下图,由于obj.print();调用时foo函数内的this指向确实是obj对象,
可是this.name='方法',执行以后,至关于把obj内部变量name从新赋值了,因此依然打印‘方法’


总结一下,其实无论foo方法内部加不加this.name='方法'这一行代码;
两种方式先后,this指向都是同样的。
只是,在obj指向的基础上,针对赋值发生了变化而已。


以上是针对函数内部修改后

假如咱们将函数修改成箭头函数呢,

var foo=()=>{
debugger;
this.name='方法'
console.log(this.name)
}

obj={
name:'内部',
print:foo
}

由于箭头函数是,定义时决定this指向,

foo函数是在全局环境中定义的,因此this指向会一直指向window
验证一下
obj.print()

this 果真指向了window而不是obj

相关文章
相关标签/搜索