this到底指向哪里呢?

有時(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í)行以下操作:

  1. 創(chuàng)建一個(gè)全新的對(duì)象。
  2. 這個(gè)新對(duì)象會(huì)被執(zhí)行[[prototype]]連接。
  3. 這個(gè)新對(duì)象會(huì)被綁定到函數(shù)調(diào)用的this。
  4. 如果函數(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ù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容