摘要:它代表函數(shù)運(yùn)行時(shí),自動(dòng)生成的一個(gè)內(nèi)部對(duì)象,只能在函數(shù)內(nèi)部使用類似的還有。總結(jié)關(guān)鍵字就是,誰調(diào)用我,我就指向誰。注意由于已經(jīng)被定義為函數(shù)內(nèi)的一個(gè)變量。因此通過關(guān)鍵字定義或者將聲明為一個(gè)形式參數(shù),都將導(dǎo)致原生的不會(huì)被創(chuàng)建。
題目
封裝函數(shù) f,使 f 的 this 指向指定的對(duì)象 。
輸入例子bindThis(function(a, b) { return this.test + a + b; }, {test: 1})(2, 3);輸出例子
6分析 題目拆解
該題目的要求是:封裝一個(gè)函數(shù)bindThis,該函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)是一個(gè)內(nèi)部有使用this指針的函數(shù)f,第二個(gè)參數(shù)是一個(gè)對(duì)象obj,執(zhí)行bindThis之后,返回一個(gè)函數(shù),該函數(shù)里面的this就被綁定到obj上面。。。好吧,我承認(rèn)我剛看到這個(gè)時(shí),也很暈,但是如果我把它寫成下面的樣子,是不是就感覺好多了呢?
function f(a, b) { return this.test + a + b; } function bindThis(f, obj) { //你實(shí)現(xiàn)的部分 } //執(zhí)行函數(shù) var a = bindThis(f,{test:1}); a(2,3);什么是this
this是Javascript語言的一個(gè)關(guān)鍵字。它代表函數(shù)運(yùn)行時(shí),自動(dòng)生成的一個(gè)內(nèi)部對(duì)象,只能在函數(shù)內(nèi)部使用(類似的還有arguments)。具體的大家可以看看阮一峰的Javascript的this用法
和變量不同,關(guān)鍵字this沒有作用域的限制,嵌套的函數(shù)不會(huì)從調(diào)用它的函數(shù)中繼承this。
簡(jiǎn)單的將this的指向分為四種情況:
函數(shù)調(diào)用
這是函數(shù)的最通常用法,屬于全局性調(diào)用,其this的值不是全局對(duì)象Global(非嚴(yán)格模式下)就是undefined(嚴(yán)格模式下)。
對(duì)象方法調(diào)用
函數(shù)還可以作為某個(gè)對(duì)象的方法調(diào)用,這時(shí)this就指這個(gè)上級(jí)對(duì)象.
構(gòu)造函數(shù)調(diào)用
所謂構(gòu)造函數(shù),就是通過這個(gè)函數(shù)生成一個(gè)新對(duì)象(object)。這時(shí),this就指這個(gè)新對(duì)象。
bind apply call
apply()是函數(shù)對(duì)象的一個(gè)方法,它的作用是改變函數(shù)的調(diào)用對(duì)象,它的第一個(gè)參數(shù)就表示改變后的調(diào)用這個(gè)函數(shù)的對(duì)象。因此,this指的就是這第一個(gè)參數(shù)。bind,call類似。
總結(jié):this關(guān)鍵字就是,誰調(diào)用我,我就指向誰。
解決方法首先,看到this的綁定這幾個(gè)字,你是不想條件反射的想起了javascript的三劍客:bind apply call?
bind apply call的區(qū)別call 和 apply 都是為了改變某個(gè)函數(shù)運(yùn)行時(shí)的 context 即上下文而存在的,換句話說,就是為了改變函數(shù)體內(nèi)部 this 的指向。因?yàn)?JavaScript 的函數(shù)存在「定義時(shí)上下文」和「運(yùn)行時(shí)上下文」以及「上下文是可以改變的」這樣的概念。
相同點(diǎn):
都可以為函數(shù)綁定this。
不同點(diǎn):
call和apply基本的區(qū)別:參數(shù)不同。apply() 接收兩個(gè)參數(shù),第一個(gè)是綁定 this 的值,第二個(gè)是一個(gè)參數(shù)數(shù)組。而 call() 呢,它的第一個(gè)參數(shù)也是綁定給 this 的值,但是后面接受的是不定參數(shù),而不再是一個(gè)數(shù)組,也就是說你可以像平時(shí)給函數(shù)傳參那樣把這些參數(shù)一個(gè)一個(gè)傳遞。
bind的區(qū)別:創(chuàng)建一個(gè)新的函數(shù)。具體的可以看看這篇文章理解 Javascript 的 Function.prototype.bind
解決方法一:使用bind()下面的例子是其中一個(gè)解決方法,同時(shí)也說明了bind()方法是創(chuàng)建了一個(gè)新的函數(shù)。
function f(a, b) { return this.test + a + b; } function bindThis(f, obj) { //你實(shí)現(xiàn)的部分 return f.bind(obj); } //執(zhí)行函數(shù) var a = bindThis(f,{test:1}); console.log(a(2,3)); console.log(f(2,3));
輸出結(jié)果:
6 NaN解決方法二:使用apply()
function bindThis(f, obj) { //你實(shí)現(xiàn)的部分 return function () { return f.apply(obj, arguments); }; }
這里使用一個(gè)函數(shù)包裝了一下apply方法,然后返回該函數(shù)。
arguments是JavaScript 中每個(gè)函數(shù)內(nèi)都能訪問一個(gè)特別變量 arguments。這個(gè)變量維護(hù)著所有傳遞到這個(gè)函數(shù)中的參數(shù)列表。
注意: 由于 arguments 已經(jīng)被定義為函數(shù)內(nèi)的一個(gè)變量。 因此通過 var 關(guān)鍵字定義 arguments 或者將 arguments 聲明為一個(gè)形式參數(shù), 都將導(dǎo)致原生的 arguments 不會(huì)被創(chuàng)建。
arguments 變量不是一個(gè)數(shù)組(Array)。 盡管在語法上它有數(shù)組相關(guān)的屬性 length,但它不從 Array.prototype 繼承,實(shí)際上它是一個(gè)對(duì)象(Object)。
解決方法三:使用call()和apply()類似,僅參數(shù)的傳入方式不同。
function bindThis(f, obj) { //你實(shí)現(xiàn)的部分 return function (a,b) { return f.call(obj, a,b); }; }總結(jié)
該題目主要考察的是this關(guān)鍵字及改變this指向的方法,再下才疏學(xué)淺,只能找到這幾個(gè)方法了,但是鑒于javascript這門語言的靈活性,我老感覺應(yīng)該是還有其他的方法的,希望各位知道了能夠不吝賜教。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/79474.html
摘要:原文地址基礎(chǔ)心法歡迎。作為一個(gè)構(gòu)造函數(shù)被綁定到正在構(gòu)造的新對(duì)象。通過構(gòu)造函數(shù)創(chuàng)建一個(gè)對(duì)象其實(shí)執(zhí)行這樣幾個(gè)步驟創(chuàng)建新對(duì)象將指向這個(gè)對(duì)象給對(duì)象賦值屬性方法返回所以就是指向創(chuàng)建的這個(gè)對(duì)象上。 原文地址:JavaScript基礎(chǔ)心法——this 歡迎star。 如果有錯(cuò)誤的地方歡迎指正。 看看這個(gè)有著深不可測(cè)的魔力的this到底是個(gè)什么玩意兒 ~ 什么是this 在傳統(tǒng)面向?qū)ο蟮恼Z言中,比如...
摘要:第一部分請(qǐng)點(diǎn)擊快速掌握面試基礎(chǔ)知識(shí)一閉包閉包由一個(gè)函數(shù)以及該函數(shù)定義是所在的環(huán)境組成。當(dāng)匿名函數(shù)執(zhí)行的時(shí)候,的值為。這個(gè)問題可以改用后面會(huì)介紹方法來解決,通過對(duì)每一個(gè)匿名函數(shù)構(gòu)建獨(dú)立的外部作用域來實(shí)現(xiàn)。 譯者按: 總結(jié)了大量JavaScript基本知識(shí)點(diǎn),很有用! 原文: The Definitive JavaScript Handbook for your next develope...
摘要:第一部分請(qǐng)點(diǎn)擊快速掌握面試基礎(chǔ)知識(shí)一關(guān)鍵字如果使用關(guān)鍵字來調(diào)用函數(shù)式很特別的形式。該對(duì)象默認(rèn)包含了指向原構(gòu)造函數(shù)的屬性。接下來通過例子來幫助理解屬性包含了構(gòu)造函數(shù)以及構(gòu)造函數(shù)中在上定義的屬性。也就是說,的回調(diào)函數(shù)后執(zhí)行。 譯者按: 總結(jié)了大量JavaScript基本知識(shí)點(diǎn),很有用! 原文: The Definitive JavaScript Handbook for your next...
摘要:當(dāng)解釋器尋找引用值時(shí),會(huì)首先檢索其在棧中的地址,取得地址后從堆中獲得實(shí)體如何實(shí)現(xiàn)繼承構(gòu)造繼承原型繼承實(shí)例繼承拷貝繼承原型機(jī)制或和方法去實(shí)現(xiàn)較簡(jiǎn)單,建議使用構(gòu)造函數(shù)與原型混合方式。它是基于的一個(gè)子集。 JavaScript介紹js的基本數(shù)據(jù)類型。Undefined、Null、Boolean、Number、Stri...
摘要:它可以接收兩個(gè)參數(shù),表示要查找的子字符串,表示查找的開始位置,省略的話則從開始位置進(jìn)行檢索。它會(huì)返回第一個(gè)匹配的子字符串的起始位置,如果沒有匹配的,則返回。返回一個(gè)布爾值,表示指定的對(duì)象是否在本對(duì)象的原型鏈中。 前言 前端開發(fā)最基本的就是HTML + CSS + JS了,剛?cè)胄袝r(shí)聽到的介紹就是,寫頁面亦如造房子,HTML為搭戶型,CSS是房屋裝飾,JS則好比是水電安裝,是最后的功能了。...
閱讀 1213·2021-11-24 09:39
閱讀 2133·2021-11-22 13:54
閱讀 2126·2021-09-08 10:45
閱讀 1452·2021-08-09 13:43
閱讀 2990·2019-08-30 15:52
閱讀 3089·2019-08-29 15:38
閱讀 2852·2019-08-26 13:44
閱讀 3057·2019-08-26 13:30