- 首先是一个题目
let obj = {
a:1,
bar:function(){
console.log('bar',this.a)
function foo(){
console.log('foo',this.a)
}
foo()
}
}
obj.bar()
bar 1
foo undefined
- foo内的this指向是window
- this 是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调用时的各种条件
- this绑定的规则
现在我们可以根据优先级来判断函数在某个调用位置应用的是哪条规则。可以按照下面的
顺序来进行判断:
1. 函数是否在 new 中调用( new 绑定)?如果是的话 this 绑定的是新创建的对象。
var bar = new foo()
2. 函数是否通过 call 、 apply (显式绑定)或者硬绑定调用?如果是的话, this 绑定的是
指定的对象。
var bar = foo.call(obj2)
3. 函数是否在某个上下文对象中调用(隐式绑定)?如果是的话, this 绑定的是那个上
下文对象。
var bar = obj1.foo()
4. 如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到 undefined ,否则绑定到
全局对象。
var bar = foo()
就是这样。对于正常的函数调用来说,理解了这些知识你就可以明白 this 的绑定原理了。
不过……凡事总有例外。
- 在代码中, foo()是直接使用不带任何修饰的函数引用进行调用的,因此只能使用默认绑定,无法应用其他规则。
- 一个最常见的 this 绑定问题就是被隐式绑定的函数会丢失绑定对象;如传入回调函数(setTimeout等)、函数引用
-
this与箭头函数
this与箭头函数
网友评论