早上偷跑內(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))