溫馨提示:作者的爬坑記錄,對(duì)你等大神完全沒有價(jià)值,別在我這浪費(fèi)生命
這一切,源于阮大神博文學(xué)習(xí)Javascript閉包(Closure)- 阮一峰中的一道思考題
//問題1: var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()());
這道題,出現(xiàn)在了關(guān)于閉包的博文之中,而阮大神的一句“如果你能理解下面兩段代碼的運(yùn)行結(jié)果,應(yīng)該就算理解閉包的運(yùn)行機(jī)制了。”徹底激發(fā)了我的斗志。
乍一看,外面一個(gè)變量叫name,對(duì)象內(nèi)還有一個(gè)變量是name這就很明顯了,這就是在考察對(duì)于作用域鏈的理解了,這里返回的應(yīng)該是一個(gè)妥妥的“My Object”,
可是運(yùn)行結(jié)果卻狠狠大打了我的臉,但是彈出的一個(gè)大大“The Window”讓我不得不重新面對(duì)這一段代碼,這里面的this指得到底是什么?
進(jìn)一步嘗試,將this打印到控制臺(tái)上出現(xiàn)的結(jié)果是“window”,這下就明白了,問題就出在了this上,它并沒有按照我所想的去指向了object而是指向了全局對(duì)象window這就是為什么會(huì)返回“The Window”了
//在這里,把this去掉也會(huì)返回“My Object”具體原因還沒整明白以后補(bǔ)充
再看阮大神給出的第二道題就更懵逼了
//問題2: var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ var that = this; return function(){ return that.name; }; } }; alert(object.getNameFunc()());//My Object
按照這幾行代碼的意思,在getNameFunc的this指向的是object而在其內(nèi)部的函數(shù)中,則會(huì)指向全局對(duì)象,這去哪說理,再次又開始狂搜博文
Javascript的this用法 - 阮一峰
徹底理解js中this的指向,不必硬背。- 追夢子
JS 中 this 關(guān)鍵字詳解 - 蘋果小蘿卜
JavaScript中知而不全的this - Snandy
看了一圈,心里算是有了普,get到了一個(gè)基本的概念
this指向的是調(diào)用它的對(duì)象
這也就是說,在對(duì)象定義的時(shí)候this并沒有一個(gè)具體的指向,只有當(dāng)被調(diào)用時(shí),this才會(huì)被賦值給調(diào)用他的對(duì)象,了解了這個(gè)概念,再回頭看看第一題,還是有問題這句object.getNameFunc()()在執(zhí)行的時(shí)候到底發(fā)生了什么,我們對(duì)第一題做一些改變
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ console.log(this.name) return function(){ console.log(this.name) return this.name; }; } }; object.getNameFunc()//My Object 執(zhí)行語句1 object.getNameFunc()()//The Window 執(zhí)行語句2
在執(zhí)行語句1中,可以理解getNameFunc()是被object對(duì)象所調(diào)用,在函數(shù)中的this就指向了object,所以就出現(xiàn)了這個(gè)結(jié)果,
在執(zhí)行語句2中,我們可以理解為執(zhí)行語句1的返回函數(shù),被執(zhí)行了一次,而執(zhí)行它的就是我們的window對(duì)象了,為了便于理解我們把執(zhí)行語句2進(jìn)行改寫
var getVal = object.getNameFunc() getVal()//The Window
實(shí)際上,執(zhí)行語句2就是執(zhí)行了getVal()而這個(gè)函數(shù)的執(zhí)行對(duì)象是window,所以就出現(xiàn)了上文中的結(jié)果。
我們再來看問題2就很明白了var that = this;是在object.getNameFunc()執(zhí)行的過程中被執(zhí)行的,所以這里的this指向的就是object而把他賦值給變量that后實(shí)際上就是把object賦值給了that(有不嚴(yán)謹(jǐn)之處,領(lǐng)會(huì)精神),而由于that處于內(nèi)部函數(shù)的作用域鏈中,不能被釋放,連同返回的內(nèi)部函數(shù)形成閉包(終于見到你了),所以一直都指向了object,所以題目2的最終結(jié)果就是“My Object”了
長出一口氣
這么看this這個(gè)概念很是神奇,并且包含了許多對(duì)象方面的知識(shí),使我不禁對(duì)徹底弄明白他的各種應(yīng)用方法和原理產(chǎn)生了不切實(shí)際的幻想,那么交給寫后文的未來的我去梳理把
能看到這的都是真愛
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/90182.html
摘要:注意該方法的作用和方法類似,只有一個(gè)區(qū)別,就是方法接受的是若干個(gè)參數(shù)的列表,而方法接受的是一個(gè)包含多個(gè)參數(shù)的數(shù)組。指定的參數(shù)列表。返回值返回值是你調(diào)用的方法的返回值,若該方法沒有返回值,則返回。 溫馨提示:作者的爬坑記錄,對(duì)你等大神完全沒有價(jià)值,別在我這浪費(fèi)生命溫馨提示-續(xù):打call原本是屬于我們偶像宅文化中的專業(yè)名詞,指的是飯們在看live時(shí)在臺(tái)下配合愛豆演出的節(jié)奏喊口號(hào),舉例:超...
摘要:基礎(chǔ)語法參數(shù)參數(shù)參數(shù)函數(shù)聲明參數(shù)參數(shù)參數(shù)表達(dá)式單一相當(dāng)于參數(shù)參數(shù)參數(shù)表達(dá)式當(dāng)只有一個(gè)參數(shù)時(shí),圓括號(hào)是可選的單一參數(shù)函數(shù)聲明單一參數(shù)函數(shù)聲明沒有參數(shù)的函數(shù)應(yīng)該寫成一對(duì)圓括號(hào)。 溫馨提示:作者的爬坑記錄,對(duì)你等大神完全沒有價(jià)值,別在我這浪費(fèi)生命溫馨提示-續(xù):你們要非得看,我也攔不住,但是至少得準(zhǔn)備個(gè)支持ES6的Chrome瀏覽器吧? 之前在某些大神的代碼中出現(xiàn)一串神秘符號(hào)類似于num =>...
摘要:閉包一詞來源于以下兩者的結(jié)合要執(zhí)行的代碼塊由于自由變量被包含在代碼塊中,這些自由變量以及它們引用的對(duì)象沒有被釋放和為自由變量提供綁定的計(jì)算環(huán)境作用域。在以及及以上等語言中都能找到對(duì)閉包不同程度的支持。 溫馨提示:作者的爬坑記錄,對(duì)你等大神完全沒有價(jià)值,別在我這浪費(fèi)生命 閉包,好吃嗎 ? 第一次聽到這個(gè)詞,很不幸是在一次面試中,可想而知結(jié)果很細(xì)碎,從此閉包和跨域在我匱乏的前端知識(shí)中成為了...
摘要:這是因?yàn)樽宇悰]有自己的對(duì)象,而是繼承父類的對(duì)象,然后對(duì)其進(jìn)行加工。 溫馨提示:作者的爬坑記錄,對(duì)你等大神完全沒有價(jià)值,別在我這浪費(fèi)生命溫馨提示-續(xù):你們要非得看,我也攔不住,但是至少得準(zhǔn)備個(gè)支持ES6的Chrome瀏覽器吧?溫馨提示-再續(xù):ES6簡直了,放著不用簡直令人發(fā)指! 書接上回,即便是程序員,也還是能夠通過自己的努力辛辛苦苦找到合適對(duì)象的,見前文《javascript對(duì)象不完全...
摘要:溫馨提示作者的爬坑記錄,對(duì)你等大神完全沒有價(jià)值,別在我這浪費(fèi)生命溫馨提示續(xù)本文內(nèi)容簡單,發(fā)揚(yáng)了潛入潛出的精神,請(qǐng)謹(jǐn)慎浪費(fèi)時(shí)間溫馨提示再續(xù)魔卡少女櫻動(dòng)畫再開撒花經(jīng)過前兩篇文章的梳理對(duì)象不完全探索記錄小伙子,你對(duì)象咋來的上篇對(duì)象不完全探索記 溫馨提示:作者的爬坑記錄,對(duì)你等大神完全沒有價(jià)值,別在我這浪費(fèi)生命溫馨提示-續(xù):本文內(nèi)容簡單,發(fā)揚(yáng)了潛入潛出的精神,請(qǐng)謹(jǐn)慎浪費(fèi)時(shí)間溫馨提示-再續(xù):《魔...
閱讀 3925·2021-09-27 13:56
閱讀 937·2021-09-08 09:36
閱讀 832·2019-08-30 15:54
閱讀 663·2019-08-29 17:29
閱讀 982·2019-08-29 17:21
閱讀 1752·2019-08-29 16:59
閱讀 2824·2019-08-29 13:03
閱讀 3050·2019-08-29 12:47