有時(shí)候我們太過(guò)于拘泥與“this”的字面意思就會(huì)產(chǎn)生一些誤解。
1. this是不是指向函數(shù)自身呢?
show me the code!
// 使用場(chǎng)景:記錄函數(shù)func被調(diào)用的次數(shù)
function func(num) {
console.log('func:' + num);
// 假設(shè)這個(gè)this指向自身,我們?cè)诤瘮?shù)內(nèi)部記錄下被調(diào)用的次數(shù)
this.count++;
}
func.count = 0;
// 開(kāi)始調(diào)用func
for(let i = 0; i < 10; i++) {
func(i);
}
console.log(func.count); // 是0
問(wèn)題來(lái)了 既然我們this并不指向func,那么我們?cè)黾拥腸ount到底是誰(shuí)呢?
2. this指向函數(shù)作用域
我們需要明確的知道this在任何情況下都不能指向函數(shù)的詞法作用域。
3. this到底是什么
this是在運(yùn)行的時(shí)候被綁定的,它取決與函數(shù)調(diào)用時(shí)候的各種條件,當(dāng)一個(gè)函數(shù)被調(diào)用的時(shí)候,會(huì)創(chuàng)建一個(gè)活動(dòng)記錄(執(zhí)行上下文),包含了函數(shù)調(diào)用棧,函數(shù)的調(diào)用方式,傳入的參數(shù)等信息。this就是其中的一個(gè)屬性。
4.this的默認(rèn)綁定
通俗理解一下,就是誰(shuí)調(diào)用,this便指向了誰(shuí)。
4.1 普通函數(shù)調(diào)用
// baz調(diào)用位置(this指向)是:全局
function baz () {
// baz 的this指向全局
bar(); // bar的調(diào)用位置
}
function bar () {
// bar 的this指向baz,調(diào)用棧是baz->bar
foo(); // foo的調(diào)用位置
}
baz();
4.2 對(duì)象方法的調(diào)用
function foo(){
console.log(this.a);
}
var obj = {
a:2,
foo: foo
}
obj.foo() // 2
當(dāng)foo()被調(diào)用的時(shí)候,this的掛載指向obj,因此函數(shù)調(diào)用中的this也自然的指向了obj。
5.this的強(qiáng)制綁定
在嚴(yán)格模式下,經(jīng)常會(huì)出現(xiàn)一個(gè)問(wèn)題,函數(shù)丟失了他的綁定對(duì)象,被默認(rèn)綁定到了全局對(duì)象或者undefined上了。
function foo () {
console.log(this.a);
}
function doFoo (fn) {
fn(); // obj.foo的調(diào)用位置
}
var obj = {
a: 2,
foo: foo
}
var a = 'global';
doFoo(obj.foo);
在回調(diào)函數(shù)中我們很容易遇到丟失this的情況,我們沒(méi)辦法控制函數(shù)的調(diào)用位置,因此僅僅只用默認(rèn)綁定,沒(méi)辦法得到期望的綁定。
(1)構(gòu)造函數(shù)調(diào)用
當(dāng)我們?cè)贘S中使用new來(lái)調(diào)用函數(shù)。會(huì)自動(dòng)執(zhí)行以下操作:
- 創(chuàng)建一個(gè)全新的對(duì)象。
- 這個(gè)新對(duì)象會(huì)被執(zhí)行
[[prototype]]連接。 - 這個(gè)新對(duì)象會(huì)被綁定到函數(shù)調(diào)用的this。
- 如果函數(shù)沒(méi)有返回其他對(duì)象,new表達(dá)式中的函數(shù)調(diào)用會(huì)自動(dòng)返回這個(gè)新的對(duì)象。
(2)call/apply調(diào)用
call方法形式,fun.call(thisArg[, arg1[, arg2[, ...]]])
-
thisArg,當(dāng)前this指向 -
arg1[, arg2[, ...]],指定的參數(shù)列表
apply方法調(diào)用,fun.apply(thisArg,[arg1[, arg2[, ...]]]) - thisArg,當(dāng)前this指向
- 一個(gè)數(shù)組或者類數(shù)組對(duì)象,其中的數(shù)組元素將作為單獨(dú)的參數(shù)傳給fun函數(shù)