1、沿著作用域向上找最近一個(gè)function(不是箭頭函數(shù)),看這個(gè)function是如何執(zhí)行的
2 吮成、this指向取決于所屬function是如何調(diào)用的橱乱,而不是定義
3辜梳、function調(diào)用一般分為以下幾種情況
- 作為函數(shù)去調(diào)用,即:foo()
指全局對(duì)象(globalThis)泳叠,注意嚴(yán)格模式下的問(wèn)題作瞄,嚴(yán)格模式下
undefined - 作為方法去調(diào)用,即:obj.foo()
指向最終調(diào)用這個(gè)方法的對(duì)象 - 作為構(gòu)造函數(shù)去調(diào)用危纫,即:new Foo()
指向一個(gè)新的對(duì)象Foo {} - 特殊調(diào)用宗挥,即:foo.call()、foo.apply()种蝶、foo.bind()
指向參數(shù)指定成員 - 找不到所屬function契耿,就是全局對(duì)象
// 1、作為函數(shù)去調(diào)用
function foo () {
console.log(this)
}
foo() // this指向全局對(duì)象(globalThis)
// 2螃征、作為方法去調(diào)用
const obj = {
foo: function() {
console.log(this)
}
}
obj.foo() // this指向obj這個(gè)對(duì)象
// 3搪桂、作為構(gòu)造函數(shù)去調(diào)用
function Person() {
console.log(this)
}
new Person() // 指向Person {}這個(gè)新的對(duì)象
// 4、特殊調(diào)用
const obj = {
name: 'jack'
}
function foo() {
console.log(this)
}
foo.call(obj) // this指向obj這個(gè)對(duì)象
foo.call(1) // this指向1
-----------------------------------------------------
foo.apply(obj) // this指向obj這個(gè)對(duì)象
foo.apply(1) // this指向1
-----------------------------------------------------
foo.bind(obj)() // this指向obj這個(gè)對(duì)象
foo.bind(1)() // this指向1