(記錄筆記)
- 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)階)