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