what is "this" in JavaScript

前言

關(guān)于javascript中的this究竟指的是什么,已經(jīng)有很多文章寫過,在這里總結(jié)一下。

書中的重要觀點(diǎn)

  1. this的指向并不是指向函數(shù)本身或函數(shù)的詞法作用域;
  2. this的值是在函數(shù)調(diào)用時(shí)才綁定的,創(chuàng)建時(shí)并沒有綁定this;
  3. this的指向取決于在何處被調(diào)用。

函數(shù)的調(diào)用模式

在說this的綁定方式之前,我們先談?wù)労瘮?shù)的調(diào)用。調(diào)用一個(gè)函數(shù)時(shí),會(huì)暫停當(dāng)前函數(shù)的執(zhí)行傳遞控制權(quán)和參數(shù)給調(diào)用的函數(shù)。除了函數(shù)聲明時(shí)定義的形參,函數(shù)還會(huì)接受兩個(gè)附加的參數(shù): arguments和this,arguments即函數(shù)的入?yún)ⅲ瑃his的指向和函數(shù)的調(diào)用模式有關(guān)。

在javascript中,函數(shù)的調(diào)用模式一般分為四種:方法調(diào)用模式、函數(shù)調(diào)用模式、構(gòu)造器調(diào)用模式、apply調(diào)用模式。

  1. 方法調(diào)用模式
    當(dāng)一個(gè)函數(shù)作為一個(gè)對(duì)象的一個(gè)屬性時(shí),我們稱之為方法。當(dāng)一個(gè)方法被調(diào)用時(shí),函數(shù)的this指向調(diào)用該方法的對(duì)象。
  2. 函數(shù)調(diào)用模式
    當(dāng)一個(gè)函數(shù)不作為一個(gè)對(duì)象的屬性時(shí),就是我們最常見的函數(shù)調(diào)用模式。在這種情況下如果是非嚴(yán)格模式(non-strict mode)下運(yùn)行則this指向全局對(duì)象,瀏覽器下為window,node模式下為global。
  3. 構(gòu)造器調(diào)用模式
    當(dāng)一個(gè)函數(shù)被當(dāng)做“構(gòu)造函數(shù)”(嚴(yán)格來講構(gòu)造函數(shù)和普通函數(shù)沒有區(qū)別),當(dāng)我們用關(guān)鍵字new來以“構(gòu)造函數(shù)”為藍(lán)圖來創(chuàng)建一個(gè)對(duì)象時(shí),函數(shù)中的this就會(huì)指向創(chuàng)建的對(duì)象實(shí)例。
  4. apply調(diào)用模式
    apply方法讓我們構(gòu)建一個(gè)參數(shù)數(shù)組傳給需要調(diào)用的函數(shù),apply接受兩個(gè)參數(shù),第一個(gè)為this綁定的值,第二個(gè)即需要傳入的參數(shù)數(shù)組。apply方法可以顯式地綁定this的值,類似的還有bind和call,需要注意地是,bind方法是返回一個(gè)新的函數(shù)。

this判斷規(guī)則

  1. 看是否由 new 調(diào)用?是則綁定到新創(chuàng)建的對(duì)象。
  2. 再看是否由 call 或者 apply (或者 bind )調(diào)用?綁定到指定的對(duì)象。
  3. 看函數(shù)是否為上下文對(duì)象的方法調(diào)用?是則綁定到那個(gè)上下文調(diào)用方法的對(duì)象。(特點(diǎn)是用"."或者"[ ]"來調(diào)用)
  4. 默認(rèn)函數(shù)調(diào)用:在嚴(yán)格模式下綁定到 undefined ,否則綁定到全局對(duì)象。
    ES6 中的箭頭函數(shù)并不會(huì)使用四條標(biāo)準(zhǔn)的綁定規(guī)則,而是根據(jù)當(dāng)前的詞法作用域來決定this ,具體來說,箭頭函數(shù)會(huì)繼承外層函數(shù)調(diào)用的 this 綁定(無論 this 綁定到什么)。這其實(shí)和 ES6 之前代碼中的 self = this 機(jī)制一樣。

tips:

  1. 回調(diào)函數(shù)丟失 this 綁定是非常常見的,如settimeout();
  2. 一些流行的JavaScript 庫(kù)中事件處理器常會(huì)把回調(diào)函數(shù)的 this 強(qiáng)制綁定到觸發(fā)事件的 DOM 元素上。
最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 函數(shù)和對(duì)象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門語(yǔ)言來說都是核心的概念。通過函數(shù)可以封裝任意多條語(yǔ)句,而且...
    道無虛閱讀 4,926評(píng)論 0 5
  • 1.概念 在JavaScript中,this 是指當(dāng)前函數(shù)中正在執(zhí)行的上下文環(huán)境,因?yàn)檫@門語(yǔ)言擁有四種不同的函數(shù)調(diào)...
    BluesCurry閱讀 1,236評(píng)論 0 2
  • 1. this之謎 在JavaScript中,this是當(dāng)前執(zhí)行函數(shù)的上下文。因?yàn)镴avaScript有4種不同的...
    百里少龍閱讀 1,092評(píng)論 0 3
  • 關(guān)于 this this 關(guān)鍵字是 JavaScript 中最復(fù)雜的機(jī)制之一。它是一個(gè)很特別的關(guān)鍵字,被自動(dòng)定義在...
    游學(xué)者灬墨槿閱讀 625評(píng)論 1 2
  • JavaScript語(yǔ)言精粹 前言 約定:=> 表示參考相關(guān)文章或書籍; JS是JavaScript的縮寫。 本書...
    微笑的AK47閱讀 653評(píng)論 0 3

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