2022-03-03——拒絕擺爛第二天(原型鏈&閉包&改變this指向)

早上偷跑內(nèi)容:

關(guān)于獲取body元素的方法

document.getElementById("id") 通過(guò)id或許元素

document.getElementByClassName("class") 通過(guò)class獲取元素

這里注釋一下,這里如果去接收document.getElementByClassName獲取的元素,會(huì)自動(dòng)建立一個(gè)數(shù)組HTMLcollection萍摊,來(lái)儲(chǔ)存類名钩蚊。

而id并不是這樣蝎困,id作為全局唯一的值离赫,會(huì)作為唯一對(duì)象保存坚踩,并且無(wú)法直接用控制臺(tái)console.log()墓阀,或者write()輸出毡惜,這樣做的話會(huì)顯示object HTMLHeadingElement,必須用innerHTML輸出斯撮,可以理解為id接受的話會(huì)以特殊方法裝載经伙,而innerHTML就是鑰匙。


document.write和innerHTML的區(qū)別

document的作用是向頁(yè)面寫入文檔流勿锅,會(huì)重繪整個(gè)頁(yè)面帕膜。如果在輸出之前頁(yè)面已經(jīng)有內(nèi)容,那么在執(zhí)行以后會(huì)刪除之前的內(nèi)容

而innerHTML將內(nèi)容寫入某個(gè)DOM節(jié)點(diǎn)溢十,不會(huì)導(dǎo)致頁(yè)面全部重繪

區(qū)別1:write是方法垮刹,而innerHTML是屬性。前者會(huì)向頁(yè)面輸出文檔流张弛;后者表示相對(duì)應(yīng)元素的內(nèi)容荒典。

區(qū)別2:重復(fù)write,會(huì)重復(fù)打印文檔吞鸭,重復(fù)n次寺董,頁(yè)面就會(huì)有n個(gè)"write";而innerHTML則會(huì)顯示最后一次innerHTML的內(nèi)容(反復(fù)刷新)刻剥。這里就可以解決昨晚的始終問(wèn)題遮咖,用innerHTML來(lái)渲染頁(yè)面,就可以保證實(shí)時(shí)刷新時(shí)間造虏。


原型鏈

這個(gè)看的我頭暈御吞,總之就是一個(gè)類會(huì)根據(jù)prototype去原型對(duì)象中去尋找請(qǐng)求的屬性或者方法踢械,而如果prototype沒有,則會(huì)去原型對(duì)象的對(duì)象空間中去找魄藕,如果沒有就返回undefined内列。總之就是原型對(duì)象也是對(duì)象背率,也有自己的對(duì)象空間话瞧,同樣是用__proto__去訪問(wèn),這個(gè)不用細(xì)細(xì)理解寝姿。按照玄幻小說(shuō)的說(shuō)法就是交排,每個(gè)人以及他的同系血脈都有一個(gè)共同的本命空間來(lái)存放法器,然后本命空間自己也是有自己想法的饵筑,他自己也有個(gè)本命空間埃篓,這空間就沒想法了,到頭了根资。

這也就解釋了為什么用原型方法架专、構(gòu)造方法創(chuàng)造函數(shù)時(shí)候,出來(lái)的函數(shù)里面會(huì)有一個(gè)__proto__對(duì)象玄帕,然后這玩意打開里面還有個(gè)__proto__部脚,懂了么,這就相當(dāng)于蕭炎打開自己的戒指然后又在戒指里打開藥老的戒指一樣裤纹。

p.s.3.5號(hào)更新

今天想了一下委刘,感覺可以更加明確一點(diǎn)。 __proto__(隱式原型)呢鹰椒,就像一個(gè)空間法術(shù)锡移;prototype(原型)呢,就是老祖宗的百寶袋漆际。ok現(xiàn)在開始解釋淆珊!老祖宗的百寶袋里有各種法器,縱橫江湖幾十年灿椅,很無(wú)敵套蒂。然后某一天老祖宗決定開幫立牌钞支,有了一大堆徒子徒孫茫蛹,可這幫人不爭(zhēng)氣,出去丟老祖宗的臉烁挟,于是老祖宗就用一種叫“new”的法術(shù)婴洼,為這幫笨b開掛,然后老祖宗的徒子徒孫們?nèi)巳硕紝W(xué)會(huì)了一種叫“__proto__”的空間法術(shù)撼嗓,這種法術(shù)最nb的是直接連通老祖宗的百寶袋柬采!無(wú)論多遠(yuǎn)在哪欢唾,只要有需要就可以隨時(shí)用!好了那么老祖宗的百寶袋“prototype”這幫笨b們可以隨便用粉捻,那笨b們?nèi)绻l(fā)現(xiàn)了一些奇珍異寶然后通過(guò)“__proto__”放入了百寶袋礁遣,那老祖宗那邊呢?能用不肩刃?放肆祟霍!你們這幫笨b在外丟老祖宗的臉,還不讓老祖宗用你們的東西了盈包?吃里爬外的狗東西沸呐!

ok這就是老祖宗的故事,但你們以為這就完了么呢燥,江湖這么大老祖宗也不可能一直無(wú)敵崭添,好在百寶袋兄弟爭(zhēng)氣,自己修煉出了神通叛氨!沒錯(cuò)這個(gè)神通還是“__proto__”呼渣。。這里就要問(wèn)了寞埠,百寶袋的空間法術(shù)連向哪里呢徙邻?神通之所以叫神通,就是因?yàn)榕c眾不同畸裳,百寶袋老哥的空間法術(shù)缰犁,連向的是Object的原型!Object又是誰(shuí)怖糊?如果不知道建議回爐重造帅容,Object是所有對(duì)象的老大哥!是卡密伍伤!ok并徘,百寶袋老哥修煉到能觸碰Object的prototype了,那老祖宗終于可以不用擔(dān)心扰魂,安心當(dāng)咸魚了麦乞,只需要每次在門派來(lái)新人(新實(shí)例)的時(shí)候,“new”給他一個(gè)“__proto__”就行了劝评。

【以上純屬個(gè)人理解】



以下是今日正課學(xué)習(xí)內(nèi)容:

閉包

說(shuō)實(shí)話這個(gè)東西我在csdn的教程上發(fā)現(xiàn)姐直,這是js高級(jí)語(yǔ)法之一。蒋畜。然后我看了第一句:利用閉包延長(zhǎng)局部變量的生命周期

What the fuck???????

ok声畏,所以這里我直接沒有再去參考w3c或者論壇的釋義,這對(duì)萌新來(lái)講也太痛苦了,我只寫下我的理解:

閉包是什么插龄?

閉包愿棋,就是一個(gè)封閉的環(huán)境,可以借助外部的變量均牢,但外部無(wú)法調(diào)用閉包里定義的變量糠雨。這一點(diǎn)是由作用域的特性決定的。

閉包也是一種編碼思想(技巧)徘跪,一個(gè)函數(shù)可以訪問(wèn)另一個(gè)嵌套函數(shù)作用域的變量见秤,父函數(shù) > 子函數(shù)

為什么?

函數(shù)作用域的變量是私有的,減少變量沖突真椿,可以暫存數(shù)據(jù)

怎么做鹃答?

書寫嵌套關(guān)系的函數(shù),返回子函數(shù)

子函數(shù)可以應(yīng)用父函數(shù)的變量

?觀察以下代碼突硝,變量i就出現(xiàn)沖突

var i = 0;

i ++;

console.log(i);// 1

var i = 0;

i ++;

console.log(i);// 1

var i = 0;

i ++;

console.log(i);// 1

采用閉包解決上述的沖突

? ? ? ? ? ? var add = function(){

? ? ? ? ? ? ? ? var i = 0;

? ? ? ? ? ? ? ? return function() {

? ? ? ? ? ? ? ? ? ? i ++;

? ? ? ? ? ? ? ? ? ? console.log(i);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? var f1 = add();

? ? ? ? ? ? f1();

? ? ? ? ? ? f1();

? ? ? ? ? ? f1();

? ? ? ? ? ? console.log("f1-------");


? ? ? ? ? ? var f2 = add();

? ? ? ? ? ? f2();

? ? ? ? ? ? f2();

? ? ? ? ? ? f2();

? ? ? ? ? ? f2();

? ? ? ? ? ? f2();

? ? ? ? ? ? console.log("f2-------");

? ? ? ? ? ? var f3 = add();

? ? ? ? ? ? f3();

? ? ? ? ? ? f3();

? ? ? ? ? ? f3();


this指向的改變方法

因?yàn)槲以?8號(hào)的筆記里寫了this的概念测摔,這里就只寫改變方法

call 和 apply 和 bind

這些方法的作用是改變this的指向,只是書寫方式不一樣解恰。

1. call 通過(guò)call改變this指向

先有以下代碼:

定義對(duì)象A

var _this;

var objA = {

? ? foo: function(){

? ? ? ? _this = this;

? ? ? ? console.log(this);

? ? ? ? console.log(this.color);

? ? }

}

var objB = {

? ? color: "red"

}

這行代碼 this.color是沒有值的锋八,是undefined,所以這里通過(guò)以下三種方法來(lái)使this變向:

1.objA.foo.call(objB);

2.objA.foo.apply(objB)

3.objA.foo.bind(objB)

這三行代碼 改變了foo函數(shù)作用域this的指向,此處this指向objB

this.color是有值的护盈,是 "red"

console.log(_this === objB);// true

當(dāng)然這是最簡(jiǎn)單的東西挟纱,然后詳細(xì)記錄一下使用方法,不過(guò)其實(shí)就是傳參的方法不一樣腐宋,建議記apply紊服,因?yàn)槲铱磩e人用的多

1.call

call 方法的調(diào)用者是函數(shù)

var objA = {

? ? foo: function(msg,age){

? ? ? ? console.log("顏色: ",this.color);

? ? ? ? console.log("參數(shù): ",msg,age);

? ? }

}

var objB = {

? ? color: "red"

}

objA.foo.call(objB,"hello world",20)

2.apply

apply 方法的調(diào)用者是函數(shù),和call的傳參不一樣,它用的是數(shù)組

var objA = {

? ? foo: function(msg,age){

? ? ? ? console.log("顏色: ",this.color);

? ? ? ? console.log("參數(shù): ",msg,age);

? ? }

}

var objB = {

? ? color: "red"

}

通過(guò)apply改變this指向

objA.foo.apply(objB,["hello world",20]);

3.bind

bind 方法的調(diào)用者是函數(shù)

? ? ? ? var objA = {

? ? ? ? ? ? foo: function(msg,age){

? ? ? ? ? ? ? ? console.log("顏色: ",this.color);

? ? ? ? ? ? ? ? console.log("參數(shù): ",msg,age);

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? var objB = {

? ? ? ? ? ? color: "red"

? ? ? ? }

通過(guò)bind改變this指向

objA.foo.bind(objB)("hello world",20);

總結(jié):

改變函數(shù)作用域的this指向胸竞,有call欺嗤、apply、bind這些方法

他們作用是一樣的

書寫方式不一樣

為什么需要改變this指向?

一個(gè)對(duì)象可以擁有另一個(gè)對(duì)象的屬性和方法 (繼承性地一種體現(xiàn))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卫枝,一起剝皮案震驚了整個(gè)濱河市煎饼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌校赤,老刑警劉巖吆玖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異马篮,居然都是意外死亡沾乘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門积蔚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)意鲸,“玉大人,你說(shuō)我怎么就攤上這事尽爆≡豕耍” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵漱贱,是天一觀的道長(zhǎng)槐雾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)幅狮,這世上最難降的妖魔是什么募强? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮崇摄,結(jié)果婚禮上擎值,老公的妹妹穿的比我還像新娘。我一直安慰自己逐抑,他們只是感情好鸠儿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厕氨,像睡著了一般进每。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上命斧,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天田晚,我揣著相機(jī)與錄音,去河邊找鬼国葬。 笑死贤徒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的汇四。 我是一名探鬼主播泞莉,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼船殉!你這毒婦竟也來(lái)了鲫趁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤利虫,失蹤者是張志新(化名)和其女友劉穎挨厚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糠惫,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疫剃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硼讽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巢价。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壤躲,到底是詐尸還是另有隱情城菊,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布碉克,位于F島的核電站凌唬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏漏麦。R本人自食惡果不足惜客税,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撕贞。 院中可真熱鬧更耻,春花似錦、人聲如沸捏膨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)脊奋。三九已至熬北,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诚隙,已是汗流浹背讶隐。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留久又,地道東北人巫延。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像地消,于是被迫代替她去往敵國(guó)和親炉峰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • javascript的組成 javascript 由以下三部分組成: ECMAscript(核心):javascr...
    這是這時(shí)閱讀 931評(píng)論 0 3
  • 日常學(xué)習(xí)知識(shí)點(diǎn)總結(jié)(JS篇) 1、閉包: 閉包就是函數(shù)中的函數(shù)半夷,里面的函數(shù)可以訪問(wèn)外面函數(shù)的變量婆廊,外面的變量是內(nèi)部...
    依稀_Sting閱讀 2,048評(píng)論 0 1
  • 1.javascript的typeof返回哪些數(shù)據(jù)類型 object number function boolea...
    洛珎閱讀 249評(píng)論 0 0
  • 先寫一下之前沒記錄的函數(shù)調(diào)用方式: 立即執(zhí)行函數(shù) 立即執(zhí)行函數(shù):函數(shù)定義完,立即被調(diào)用巫橄,這種函數(shù)叫做立即執(zhí)行函數(shù)淘邻,...
    月螢閱讀 435評(píng)論 1 4
  • CSS知識(shí)點(diǎn) 1 選擇器的優(yōu)先級(jí) (1)最高優(yōu)先級(jí)是 (直接在標(biāo)簽中的設(shè)置樣式,假設(shè)級(jí)別為1000) (2)次優(yōu)先...
    croyance0601閱讀 730評(píng)論 0 0