(一) 如何正確的判斷 this? 箭頭函數(shù)的 this 是什么?*
this 的綁定規(guī)則有四種:默認(rèn)綁定,隱式綁定,顯式綁定,new 綁定.
1.函數(shù)是否在 new 中調(diào)用 (new 綁定),如果是,那么 this 綁定的是新創(chuàng)建的對象;
2.函數(shù)是否通過 call,apply 調(diào)用,或者使用了 bind (即硬綁定),如果是,那么 this 綁定的就是指定的對象;
3.函數(shù)是否在某個(gè)上下文對象中調(diào)用 (隱式綁定),如果是的話,this 綁定的是那個(gè)上下文對象。一般是 obj.foo();
4.如果以上都不是,那么使用默認(rèn)綁定。如果在嚴(yán)格模式下,則綁定到 undefined,否則綁定到全局對象;
5.如果把 null 或者 undefined 作為 this 的綁定對象傳入 call、apply 或者 bind, 這些值在調(diào)用時(shí)會(huì)被忽略,實(shí)際應(yīng)用的是默認(rèn)綁定規(guī)則;
箭頭函數(shù)沒有自己的 this, 它的 this 繼承于上一層代碼塊的 this。
(二) 詞法作用域和 this 的區(qū)別
1.詞法作用域是由你在寫代碼時(shí)將變量和塊作用域?qū)懺谀睦飦頉Q定的;
2.this 是在調(diào)用時(shí)被綁定的,this 指向什么,完全取決于函數(shù)的調(diào)用位置 (關(guān)于 this 的指向問題,本文已經(jīng)有說明)。
(三) 什么是閉包?閉包的作用是什么?閉包有哪些使用場景?
閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù),創(chuàng)建閉包最常用的方式就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)。
閉包的作用有:
1. 封裝私有變量;
2. 模仿塊級作用域 (ES5 中沒有塊級作用域);
3. 實(shí)現(xiàn) JS 的模塊。
(四) 談?wù)勀銓υ偷睦斫猓?/h4>
在 JavaScript 中,每當(dāng)定義一個(gè)對象(函數(shù)也是對象)時(shí)候,對象中都會(huì)包含一些預(yù)定義的屬性。其中每個(gè)函數(shù)對象都有一個(gè) prototype 屬性,這個(gè)屬性指向函數(shù)的原型對象。使用原型對象的好處是所有對象實(shí)例共享它所包含的屬性和方法。