函數(shù)相關(guān)

(記錄筆記)

  • this關(guān)鍵字

什么是 this?this 是 JavaScript 的一個(gè)關(guān)鍵字,一般指向調(diào)用它的對象。
這句話其實(shí)有兩層意思,首先 this 指向的應(yīng)該是一個(gè)對象,更具體地說是函數(shù)執(zhí)行的“上下文對象”。其次這個(gè)對象指向的是“調(diào)用它”的對象,如果調(diào)用它的不是對象或?qū)ο蟛淮嬖?,則會指向全局對象(嚴(yán)格模式下為 undefined)。
ES6 新加入的箭頭函數(shù)不會創(chuàng)建自己的 this,它只會從自己的作用域鏈的上一層繼承 this。

改變 this 指向的常見 3 種方式有 bind、call 和 apply。call 和 apply 用法功能基本類似,都是通過傳入 this 指向的對象以及參數(shù)來調(diào)用函數(shù)。區(qū)別在于傳參方式,前者為逐個(gè)參數(shù)傳遞,后者將參數(shù)放入一個(gè)數(shù)組,以數(shù)組的形式傳遞。bind 有些特殊,它不但可以綁定 this 指向也可以綁定函數(shù)參數(shù)并返回一個(gè)新的函數(shù),當(dāng) c 調(diào)用新的函數(shù)時(shí),綁定之后的 this 或參數(shù)將無法再被改變。

  • typeof

用來獲取一個(gè)值的類型,可能的結(jié)果有下面幾種:

類型 結(jié)果
Undefined "undefined"
Boolean "boolean"
Number "number"
BigInt "bigint"
String "string"
Symbol "symbol"
函數(shù)對象 "function"
其他對象及 null "object"

  • instanceof

用于檢測構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個(gè)實(shí)例對象的原型鏈上。例如,在表達(dá)式 left instanceof right 中,會沿著 left 的原型鏈查找,看看是否存在 right 的 prototype 對象。

  • 命名提升

對于使用 var 關(guān)鍵字聲明的變量以及創(chuàng)建命名函數(shù)的時(shí)候,JavaScript 在解釋執(zhí)行的時(shí)候都會將其聲明內(nèi)容提升到作用域頂部,這種機(jī)制稱為“命名提升”。

變量的命名提升允許我們在同(子)級作用域中,在變量聲明之前進(jìn)行引用,但要注意,得到的是未賦值的變量。而且僅限 var 關(guān)鍵字聲明的變量,對于 let 和 const 在定義之前引用會報(bào)錯(cuò)。

console.log(a) // undefined

var a = 1

console.log(b) // 報(bào)錯(cuò)

let b = 2

//函數(shù)的命名提升則意味著可以在同級作用域或者子級作用域里,在函數(shù)定義之前進(jìn)行調(diào)用。
fn() // 2
function fn() {
  return 2
}

兩種方式對于調(diào)用函數(shù)方式以及返回結(jié)果而言是沒有區(qū)別的,但根據(jù)命名提升的規(guī)則,我們可以得知方式 1 創(chuàng)建了一個(gè)匿名函數(shù),讓變量 f 指向它,這里會發(fā)生變量的命名提升;如果我們在定義函數(shù)之前調(diào)用會報(bào)錯(cuò),而方式 2 則不會。

// 方式1

var f = function() {...}

// 方式2

function f() {...}

(注:筆記來自 朱德龍 前端高手進(jìn)階)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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