一、this指向的四种规则
1.默认绑定:window、独立调用也指向window
function foo(){
console.log(this); //Window
}
foo()
2.隐式绑定:对象调用 obj.foo() 谁调用就指向谁。(隐式丢失)
var obj = {
a:1,
test:function(){
console.log(this);//{a: 1, test: ƒ}
function list(){
console.log(this);//Window
}
return list
}
}
obj.test()()
3.显示绑定:call、applay、bind
function foo(){
console.log(this)//{a: 2, foo: ƒ}
}
var obj1 = {
a:1,
foo:foo
}
var obj2 = {
a:2,
foo:foo
}
obj1.foo.call(obj2)
4.new绑定规则
function bar(){
console.log(this);
}
var Person = new bar()// new会直接指向新构造函数出来的Person
function bar(){
console.log(this);//bar {}
return function baz(){
console.log(this);//{a: 1}
}
}
var obj = {
a:1
}
new bar().call(obj)
二 、箭头函数的this
注意:
1、箭头函数内部没有this,是借用父级函数的this。
function bar(){
console.log(this);//Window
return ()=>{
console.log(this);//widow
}
}
bar()()
2、用隐式绑定改变箭头函数this无效
function bar(){
console.log(this);//Window
return ()=>{
console.log(this);//window
}
}
var obj = {}
bar().call(obj)
三、this的优先
1、显式绑定大于隐式绑定
2、new绑定大于显式绑定
注意:new绑定 > 显示绑定 > 隐式绑定 > 默认绑定
四、综合提升题