摘要:加載的模塊會(huì)以參數(shù)形式傳入該函數(shù),從而在回調(diào)函數(shù)內(nèi)部就可以使用這些模塊。異步加載,和,瀏覽器不會(huì)失去響應(yīng)它指定的回調(diào)函數(shù),只有前面的模塊都加載成功后,才會(huì)運(yùn)行,解決了依賴(lài)性的問(wèn)題。插件,可以讓回調(diào)函數(shù)在頁(yè)面結(jié)構(gòu)加載完成后再運(yùn)行。
這次主要是對(duì)《高性能JavaScript》一書(shū)的讀書(shū)筆記,記錄下自己之前沒(méi)有注意到或者需要引起重視的地方 第一章 加載和執(zhí)行
js代碼在執(zhí)行過(guò)程中會(huì)阻塞瀏覽器的其他進(jìn)程,比如用戶(hù)界面的繪制。每次遇到script標(biāo)簽,頁(yè)面都必須停下里等待代碼下載,執(zhí)行,然后繼續(xù)處理其他部分。下面是幾種能減少js對(duì)性能影響的方法:
1.腳本位置如果在
中加載js文件那么由于腳本會(huì)阻塞頁(yè)面渲染,直到它們?nèi)肯螺d并執(zhí)行完,頁(yè)面渲染才會(huì)繼續(xù),表現(xiàn)為明顯的延遲,顯示空白頁(yè)面。頁(yè)面中的script標(biāo)簽越少,加載也就越快,響應(yīng)也就越迅速
3.無(wú)阻塞的腳本html4 為script標(biāo)簽定義了一個(gè)擴(kuò)展屬性defer。此屬性指明本元素所包含的腳本不會(huì)修改DOM,因此代碼可以安全地延遲執(zhí)行。
到了html5中 defer屬性?xún)H當(dāng)src屬性申明時(shí)才生效
html5中引入了async屬性 用于異步加載腳本 與defer的相同點(diǎn)是采用并行下載,不產(chǎn)生阻礙,區(qū)別在與執(zhí)行時(shí)機(jī)
async是加載完成之后自動(dòng)執(zhí)行,defer需要等待頁(yè)面完成后執(zhí)行(寫(xiě)法為defer="defer" async="true")
推薦的無(wú)阻塞模式:
向頁(yè)面中添加大量js的推薦做法需兩步:先添加動(dòng)態(tài)加載所需的代碼,然后化妝初始化頁(yè)面所需要的剩下的代碼。第一部分代碼盡量精簡(jiǎn),一旦初始化代碼就位,就用它來(lái)加載剩余的js
推薦的 工具有LAB.js和require.js
LAB.js:
*LABjs 的核心是 LAB(Loading and Blocking):Loading 指異步并行加載,Blocking 是指同步等待執(zhí)行。LABjs 通過(guò)優(yōu)雅的語(yǔ)法(script 和 wait)實(shí)現(xiàn)了這兩大特性,核心價(jià)值是性能優(yōu)化。LABjs 是一個(gè)文件加載器。
作者:玉伯
鏈接:https://www.zhihu.com/questio...
來(lái)源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。*
用法:(轉(zhuǎn)自阮一峰博客)
第二章 數(shù)據(jù)的存取引用文字下面根據(jù)ScriptJunkie的文章,舉一個(gè)最簡(jiǎn)單的例子,來(lái)說(shuō)明這兩個(gè)函數(shù)庫(kù)的基本用法。更高級(jí)的用法,請(qǐng)參閱它們的文檔。
上面這段代碼,將依次加載4個(gè)javascript文件:script1.js、script2-a.js、script2-b.js和script3.js。在加載完前三個(gè)文件后,運(yùn)行兩個(gè)函數(shù)initScript1()和initScript2();加載完第四個(gè)文件后,再運(yùn)行函數(shù)initScript3()。
下面,用LABjs對(duì)其進(jìn)行改寫(xiě):
首先,$LAB對(duì)象替代了
這段代碼依次加載多個(gè)js文件。
這樣的寫(xiě)法有很大的缺點(diǎn)。首先,加載的時(shí)候,瀏覽器會(huì)停止網(wǎng)頁(yè)渲染,加載文件越多,網(wǎng)頁(yè)失去響應(yīng)的時(shí)間就會(huì)越長(zhǎng);其次,由于js文件之間存在依賴(lài)關(guān)系,因此必須嚴(yán)格保證加載順序(比如上例的1.js要在2.js的前面),依賴(lài)性最大的模塊一定要放到最后加載,當(dāng)依賴(lài)關(guān)系很復(fù)雜的時(shí)候,代碼的編寫(xiě)和維護(hù)都會(huì)變得困難。
require.js的誕生,就是為了解決這兩個(gè)問(wèn)題:
?。?)實(shí)現(xiàn)js文件的異步加載,避免網(wǎng)頁(yè)失去響應(yīng);
(2)管理模塊之間的依賴(lài)性,便于代碼的編寫(xiě)和維護(hù)。
二、require.js的加載
使用require.js的第一步,是先去官方網(wǎng)站下載最新版本。
下載后,假定把它放在js子目錄下面,就可以加載了。
有人可能會(huì)想到,加載這個(gè)文件,也可能造成網(wǎng)頁(yè)失去響應(yīng)。解決辦法有兩個(gè),一個(gè)是把它放在網(wǎng)頁(yè)底部加載,另一個(gè)是寫(xiě)成下面這樣:
async屬性表明這個(gè)文件需要異步加載,避免網(wǎng)頁(yè)失去響應(yīng)。IE不支持這個(gè)屬性,只支持defer,所以把defer也寫(xiě)上。
加載require.js以后,下一步就要加載我們自己的代碼了。假定我們自己的代碼文件是main.js,也放在js目錄下面。那么,只需要寫(xiě)成下面這樣就行了:
data-main屬性的作用是,指定網(wǎng)頁(yè)程序的主模塊。在上例中,就是js目錄下面的main.js,這個(gè)文件會(huì)第一個(gè)被require.js加載。由于require.js默認(rèn)的文件后綴名是js,所以可以把main.js簡(jiǎn)寫(xiě)成main。
三、主模塊的寫(xiě)法
上一節(jié)的main.js,我把它稱(chēng)為"主模塊",意思是整個(gè)網(wǎng)頁(yè)的入口代碼。它有點(diǎn)像C語(yǔ)言的main()函數(shù),所有代碼都從這兒開(kāi)始運(yùn)行。
下面就來(lái)看,怎么寫(xiě)main.js。
如果我們的代碼不依賴(lài)任何其他模塊,那么可以直接寫(xiě)入javascript代碼。
// main.js
alert("加載成功!");
但這樣的話(huà),就沒(méi)必要使用require.js了。真正常見(jiàn)的情況是,主模塊依賴(lài)于其他模塊,這時(shí)就要使用AMD規(guī)范定義的的require()函數(shù)。
// main.js
require(["moduleA", "moduleB", "moduleC"], function (moduleA, moduleB, moduleC){
// some code here
});
require()函數(shù)接受兩個(gè)參數(shù)。第一個(gè)參數(shù)是一個(gè)數(shù)組,表示所依賴(lài)的模塊,上例就是["moduleA", "moduleB", "moduleC"],即主模塊依賴(lài)這三個(gè)模塊;第二個(gè)參數(shù)是一個(gè)回調(diào)函數(shù),當(dāng)前面指定的模塊都加載成功后,它將被調(diào)用。加載的模塊會(huì)以參數(shù)形式傳入該函數(shù),從而在回調(diào)函數(shù)內(nèi)部就可以使用這些模塊。
require()異步加載moduleA,moduleB和moduleC,瀏覽器不會(huì)失去響應(yīng);它指定的回調(diào)函數(shù),只有前面的模塊都加載成功后,才會(huì)運(yùn)行,解決了依賴(lài)性的問(wèn)題。
下面,我們看一個(gè)實(shí)際的例子。
假定主模塊依賴(lài)jquery、underscore和backbone這三個(gè)模塊,main.js就可以這樣寫(xiě):
require(["jquery", "underscore", "backbone"], function ($, _, Backbone){
// some code here
});
require.js會(huì)先加載jQuery、underscore和backbone,然后再運(yùn)行回調(diào)函數(shù)。主模塊的代碼就寫(xiě)在回調(diào)函數(shù)中。
四、模塊的加載
上一節(jié)最后的示例中,主模塊的依賴(lài)模塊是["jquery", "underscore", "backbone"]。默認(rèn)情況下,require.js假定這三個(gè)模塊與main.js在同一個(gè)目錄,文件名分別為jquery.js,underscore.js和backbone.js,然后自動(dòng)加載。
使用require.config()方法,我們可以對(duì)模塊的加載行為進(jìn)行自定義。require.config()就寫(xiě)在主模塊(main.js)的頭部。參數(shù)就是一個(gè)對(duì)象,這個(gè)對(duì)象的paths屬性指定各個(gè)模塊的加載路徑。
require.config({
paths: {
"jquery": "jquery.min",
"underscore": "underscore.min",
"backbone": "backbone.min"
}
});
上面的代碼給出了三個(gè)模塊的文件名,路徑默認(rèn)與main.js在同一個(gè)目錄(js子目錄)。如果這些模塊在其他目錄,比如js/lib目錄,則有兩種寫(xiě)法。一種是逐一指定路徑。
require.config({
paths: {
"jquery": "lib/jquery.min",
"underscore": "lib/underscore.min",
"backbone": "lib/backbone.min"
}
});
另一種則是直接改變基目錄(baseUrl)。
require.config({
baseUrl: "js/lib",
paths: {
"jquery": "jquery.min",
"underscore": "underscore.min",
"backbone": "backbone.min"
}
});
如果某個(gè)模塊在另一臺(tái)主機(jī)上,也可以直接指定它的網(wǎng)址,比如:
require.config({
paths: {
"jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min"
}
});
require.js要求,每個(gè)模塊是一個(gè)多帶帶的js文件。這樣的話(huà),如果加載多個(gè)模塊,就會(huì)發(fā)出多次HTTP請(qǐng)求,會(huì)影響網(wǎng)頁(yè)的加載速度。因此,require.js提供了一個(gè)優(yōu)化工具,當(dāng)模塊部署完畢以后,可以用這個(gè)工具將多個(gè)模塊合并在一個(gè)文件中,減少HTTP請(qǐng)求數(shù)。
五、AMD模塊的寫(xiě)法
require.js加載的模塊,采用AMD規(guī)范。也就是說(shuō),模塊必須按照AMD的規(guī)定來(lái)寫(xiě)。
具體來(lái)說(shuō),就是模塊必須采用特定的define()函數(shù)來(lái)定義。如果一個(gè)模塊不依賴(lài)其他模塊,那么可以直接定義在define()函數(shù)之中。
假定現(xiàn)在有一個(gè)math.js文件,它定義了一個(gè)math模塊。那么,math.js就要這樣寫(xiě):
// math.js
define(function (){
var add = function (x,y){
return x+y;
};
return {
add: add
};
});
加載方法如下:
// main.js
require(["math"], function (math){
alert(math.add(1,1));
});
如果這個(gè)模塊還依賴(lài)其他模塊,那么define()函數(shù)的第一個(gè)參數(shù),必須是一個(gè)數(shù)組,指明該模塊的依賴(lài)性。
define(["myLib"], function(myLib){
function foo(){
myLib.doSomething();
}
return {
foo : foo
};
});
當(dāng)require()函數(shù)加載上面這個(gè)模塊的時(shí)候,就會(huì)先加載myLib.js文件。
六、加載非規(guī)范的模塊
理論上,require.js加載的模塊,必須是按照AMD規(guī)范、用define()函數(shù)定義的模塊。但是實(shí)際上,雖然已經(jīng)有一部分流行的函數(shù)庫(kù)(比如jQuery)符合AMD規(guī)范,更多的庫(kù)并不符合。那么,require.js是否能夠加載非規(guī)范的模塊呢?
回答是可以的。
這樣的模塊在用require()加載之前,要先用require.config()方法,定義它們的一些特征。
舉例來(lái)說(shuō),underscore和backbone這兩個(gè)庫(kù),都沒(méi)有采用AMD規(guī)范編寫(xiě)。如果要加載它們的話(huà),必須先定義它們的特征。
require.config({
shim: {
"underscore":{
exports: "_"
},
"backbone": {
deps: ["underscore", "jquery"],
exports: "Backbone"
}
}
});
require.config()接受一個(gè)配置對(duì)象,這個(gè)對(duì)象除了有前面說(shuō)過(guò)的paths屬性之外,還有一個(gè)shim屬性,專(zhuān)門(mén)用來(lái)配置不兼容的模塊。具體來(lái)說(shuō),每個(gè)模塊要定義(1)exports值(輸出的變量名),表明這個(gè)模塊外部調(diào)用時(shí)的名稱(chēng);(2)deps數(shù)組,表明該模塊的依賴(lài)性。
比如,jQuery的插件可以這樣定義:
shim: {
"jquery.scroll": {
deps: ["jquery"],
exports: "jQuery.fn.scroll"
}
}
七、require.js插件
require.js還提供一系列插件,實(shí)現(xiàn)一些特定的功能。
domready插件,可以讓回調(diào)函數(shù)在頁(yè)面DOM結(jié)構(gòu)加載完成后再運(yùn)行。
require(["domready!"], function (doc){
// called once the DOM is ready
});
text和image插件,則是允許require.js加載文本和圖片文件。
define([
"text!review.txt",
"image!cat.jpg"
],
function(review,cat){
console.log(review);
document.body.appendChild(cat);
}
);
類(lèi)似的插件還有json和mdown,用于加載json文件和markdown文件。
在js中,數(shù)據(jù)存儲(chǔ)的位置會(huì)對(duì)代碼整體性能產(chǎn)生重大影響。數(shù)據(jù)存儲(chǔ)共有4中方式:字面量,變量,數(shù)組項(xiàng),對(duì)象成員
1.管理作用域字面量(字符串,數(shù)字,布爾值,對(duì)象,數(shù)組,函數(shù),正則表達(dá)式以及null undefined)只代表自身 不存儲(chǔ)在特定位置
訪(fǎng)問(wèn)字面量和局部變量的速度最快,相反,訪(fǎng)問(wèn)數(shù)組元素和對(duì)象成員相對(duì)較慢
在沒(méi)有優(yōu)化的js引擎 的瀏覽器中 ,建議盡可能使用局部變量。一個(gè)好的經(jīng)驗(yàn)法則是:如果某個(gè)跨作用域的值在函數(shù)中被引用一次以上,那么就把它存儲(chǔ)到局部變量里
eg:for 循環(huán)之前 var len = obj.length 而不是直接將obj.length寫(xiě)在for循環(huán)中
局部變量存在于作用域鏈的起始位置,因此訪(fǎng)問(wèn)局部變量比訪(fǎng)問(wèn)跨作用域的變量更快。變量在作用域鏈中的位置越深,訪(fǎng)問(wèn)所需時(shí)間就越長(zhǎng)。全部變量處于作用域的最末端,因此訪(fǎng)問(wèn)速度也是最慢的。
嵌套的成員對(duì)象會(huì)明顯影響性能
屬性或方法在原型鏈中的位置越深,那么訪(fǎng)問(wèn)速度就越慢
通過(guò)把常用的對(duì)象成員,數(shù)組元素,跨域變量保存在局部變量中來(lái)改善js性能,局部變量的訪(fǎng)問(wèn)速度更快
1.最小化DOM訪(fǎng)問(wèn)次數(shù),盡可能在js端處理 2.如果需要多次訪(fǎng)問(wèn)某個(gè)DMO節(jié)點(diǎn),使用局部變量存儲(chǔ)它的應(yīng)用 3.小心處理HTML集合,因?yàn)樗鼘?shí)時(shí)連系著底層文檔。把集合的長(zhǎng)度緩存到一個(gè)變量中,并在迭代中使用它,如果需要經(jīng)常操作集合,那么建議把它拷貝到一個(gè)數(shù)組中 4.使用速度更快的API 如:document.querySelectorALL()2. 重繪與重排
1.引自阮老師的 網(wǎng)頁(yè)性能管理詳解
http://www.ruanyifeng.com/blo...
結(jié)尾引用文字一、網(wǎng)頁(yè)生成的過(guò)程
要理解網(wǎng)頁(yè)性能為什么不好,就要了解網(wǎng)頁(yè)是怎么生成的。
網(wǎng)頁(yè)的生成過(guò)程,大致可以分成五步。
HTML代碼轉(zhuǎn)化成DOM
CSS代碼轉(zhuǎn)化成CSSOM(CSS Object Model)
結(jié)合DOM和CSSOM,生成一棵渲染樹(shù)(包含每個(gè)節(jié)點(diǎn)的視覺(jué)信息)
生成布局(layout),即將所有渲染樹(shù)的所有節(jié)點(diǎn)進(jìn)行平面合成
將布局繪制(paint)在屏幕上
這五步里面,第一步到第三步都非???,耗時(shí)的是第四步和第五步。
"生成布局"(flow)和"繪制"(paint)這兩步,合稱(chēng)為"渲染"(render)。
二、重排和重繪
網(wǎng)頁(yè)生成的時(shí)候,至少會(huì)渲染一次。用戶(hù)訪(fǎng)問(wèn)的過(guò)程中,還會(huì)不斷重新渲染。
以下三種情況,會(huì)導(dǎo)致網(wǎng)頁(yè)重新渲染。
修改DOM
修改樣式表
用戶(hù)事件(比如鼠標(biāo)懸停、頁(yè)面滾動(dòng)、輸入框鍵入文字、改變窗口大小等等)
重新渲染,就需要重新生成布局和重新繪制。前者叫做"重排"(reflow),后者叫做"重繪"(repaint)。
需要注意的是,"重繪"不一定需要"重排",比如改變某個(gè)網(wǎng)頁(yè)元素的顏色,就只會(huì)觸發(fā)"重繪",不會(huì)觸發(fā)"重排",因?yàn)椴季譀](méi)有改變。但是,"重排"必然導(dǎo)致"重繪",比如改變一個(gè)網(wǎng)頁(yè)元素的位置,就會(huì)同時(shí)觸發(fā)"重排"和"重繪",因?yàn)椴季指淖兞恕?br>三、對(duì)于性能的影響
重排和重繪會(huì)不斷觸發(fā),這是不可避免的。但是,它們非常耗費(fèi)資源,是導(dǎo)致網(wǎng)頁(yè)性能低下的根本原因。
提高網(wǎng)頁(yè)性能,就是要降低"重排"和"重繪"的頻率和成本,盡量少觸發(fā)重新渲染。
前面提到,DOM變動(dòng)和樣式變動(dòng),都會(huì)觸發(fā)重新渲染。但是,瀏覽器已經(jīng)很智能了,會(huì)盡量把所有的變動(dòng)集中在一起,排成一個(gè)隊(duì)列,然后一次性執(zhí)行,盡量避免多次重新渲染。
div.style.color = "blue";
div.style.marginTop = "30px";
上面代碼中,div元素有兩個(gè)樣式變動(dòng),但是瀏覽器只會(huì)觸發(fā)一次重排和重繪。
如果寫(xiě)得不好,就會(huì)觸發(fā)兩次重排和重繪。
div.style.color = "blue";
var margin = parseInt(div.style.marginTop);
div.style.marginTop = (margin + 10) + "px";
上面代碼對(duì)div元素設(shè)置背景色以后,第二行要求瀏覽器給出該元素的位置,所以瀏覽器不得不立即重排。
一般來(lái)說(shuō),樣式的寫(xiě)操作之后,如果有下面這些屬性的讀操作,都會(huì)引發(fā)瀏覽器立即重新渲染。
offsetTop/offsetLeft/offsetWidth/offsetHeight
scrollTop/scrollLeft/scrollWidth/scrollHeight
clientTop/clientLeft/clientWidth/clientHeight
getComputedStyle()
所以,從性能角度考慮,盡量不要把讀操作和寫(xiě)操作,放在一個(gè)語(yǔ)句里面。
// bad
div.style.left = div.offsetLeft + 10 + "px";
div.style.top = div.offsetTop + 10 + "px";
// good
var left = div.offsetLeft;
var top = div.offsetTop;
div.style.left = left + 10 + "px";
div.style.top = top + 10 + "px";
一般的規(guī)則是:
樣式表越簡(jiǎn)單,重排和重繪就越快。
重排和重繪的DOM元素層級(jí)越高,成本就越高。
table元素的重排和重繪成本,要高于div元素
四、提高性能的九個(gè)技巧
有一些技巧,可以降低瀏覽器重新渲染的頻率和成本。
第一條是上一節(jié)說(shuō)到的,DOM 的多個(gè)讀操作(或多個(gè)寫(xiě)操作),應(yīng)該放在一起。不要兩個(gè)讀操作之間,加入一個(gè)寫(xiě)操作。
第二條,如果某個(gè)樣式是通過(guò)重排得到的,那么最好緩存結(jié)果。避免下一次用到的時(shí)候,瀏覽器又要重排。
第三條,不要一條條地改變樣式,而要通過(guò)改變class,或者csstext屬性,一次性地改變樣式。
// bad
var left = 10;
var top = 10;
el.style.left = left + "px";
el.style.top = top + "px";
// good
el.className += " theclassname";
// good
el.style.cssText += "; left: " + left + "px; top: " + top + "px;";
第四條,盡量使用離線(xiàn)DOM,而不是真實(shí)的網(wǎng)面DOM,來(lái)改變?cè)貥邮健1热?,操作Document Fragment對(duì)象,完成后再把這個(gè)對(duì)象加入DOM。再比如,使用 cloneNode() 方法,在克隆的節(jié)點(diǎn)上進(jìn)行操作,然后再用克隆的節(jié)點(diǎn)替換原始節(jié)點(diǎn)。
第五條,先將元素設(shè)為display: none(需要1次重排和重繪),然后對(duì)這個(gè)節(jié)點(diǎn)進(jìn)行100次操作,最后再恢復(fù)顯示(需要1次重排和重繪)。這樣一來(lái),你就用兩次重新渲染,取代了可能高達(dá)100次的重新渲染。
第六條,position屬性為absolute或fixed的元素,重排的開(kāi)銷(xiāo)會(huì)比較小,因?yàn)椴挥每紤]它對(duì)其他元素的影響。
第七條,只在必要的時(shí)候,才將元素的display屬性為可見(jiàn),因?yàn)椴豢梢?jiàn)的元素不影響重排和重繪。另外,visibility : hidden的元素只對(duì)重繪有影響,不影響重排。
第八條,使用虛擬DOM的腳本庫(kù),比如React等。
第九條,使用 window.requestAnimationFrame()、window.requestIdleCallback() 這兩個(gè)方法調(diào)節(jié)重新渲染(詳見(jiàn)后文)。
這是記錄總結(jié)的前三章,以后陸續(xù)會(huì)有補(bǔ)充
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/90293.html
摘要:局部變量位于作用域鏈的起始位置,因此訪(fǎng)問(wèn)速度最快全局變量位于作用域鏈的最末端,因此訪(fǎng)問(wèn)速度最慢。如訪(fǎng)問(wèn)時(shí)間實(shí)例屬性第一層原型屬性第二層原型屬性在同一個(gè)函數(shù)中沒(méi)必要多次讀取同一個(gè)對(duì)象成員,建議第一次查詢(xún)到值后就將其存儲(chǔ)在局部變量中。 javascript中有四種基本的數(shù)據(jù)存取位置:字面量、變量、數(shù)組元素、對(duì)象成員。 1.訪(fǎng)問(wèn)字面量和局部變量的速度最快,訪(fǎng)問(wèn)數(shù)組元素和對(duì)象成員相對(duì)較慢。 2...
摘要:除此以外,讓元素脫離文檔流也是一個(gè)很好的方法。因?yàn)樵匾坏┟撾x文檔流,它對(duì)其他元素的影響幾乎為零,性能的損耗就能夠有效局限于一個(gè)較小的范圍。講完重排與重繪,往元素上綁定事件也是引起性能問(wèn)題的元兇。高性能這本書(shū)非常精致,內(nèi)容也非常豐富。 showImg(https://segmentfault.com/img/bVJgbt?w=600&h=784); 入手《高性能JavaScript》一...
摘要:設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐讀書(shū)筆記最近利用碎片時(shí)間在上面閱讀設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐讀書(shū)這本書(shū),剛開(kāi)始閱讀前兩章內(nèi)容,和大家分享下我覺(jué)得可以在項(xiàng)目中用的上的一些筆記。事件綁定暫時(shí)這么多,以后會(huì)不定期更新一些關(guān)于我讀這本書(shū)的筆記內(nèi)容 JavaScript 設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐讀書(shū)筆記 最近利用碎片時(shí)間在 Kindle 上面閱讀《JavaScript 設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐讀書(shū)》這本書(shū),剛開(kāi)始閱讀前兩章內(nèi)容,...
摘要:作用域鏈查找作用域鏈的查找是逐層向上查找。而全局變量和閉包則會(huì)與之相反,繼續(xù)保存,所以使用用后需手動(dòng)標(biāo)記清除,以免造成內(nèi)存泄漏。獲取元素的屬性獲取元素的屬性等參考文檔高級(jí)程序設(shè)計(jì)作者以樂(lè)之名本文原創(chuàng),有不當(dāng)?shù)牡胤綒g迎指出。 showImg(https://segmentfault.com/img/bVburXV?w=500&h=399); 作用域鏈查找 作用域鏈的查找是逐層向上查找。查...
摘要:包括元素的高度上下內(nèi)邊距上下邊框值,如果元素的的值為那么該值為。該值為元素的包含元素。最后,所有這些偏移量都是只讀的,而且每次訪(fǎng)問(wèn)他們都需要重新計(jì)算。為了避免重復(fù)計(jì)算,可以將計(jì)算的值保存起來(lái),以提高性能。 offsetHeight 包括元素的高度、上下內(nèi)邊距、上下邊框值,如果元素的style.display的值為none,那么該值為0。offsetWidth 包括元素的寬度、左...
摘要:設(shè)定瀏覽器屬性的屬性的方法叫做駝峰式命名是函數(shù)名方法名和對(duì)象屬性名的命名首選格式。由瀏覽器預(yù)先定義的對(duì)象被稱(chēng)為宿主對(duì)象。在給某個(gè)元素添加了事件處理函數(shù)后,一旦事件發(fā)生,相應(yīng)的代碼就會(huì)執(zhí)行。 1.JavaScript是一個(gè)使網(wǎng)頁(yè)具有交互能力的程序設(shè)計(jì)語(yǔ)言。 2.設(shè)定瀏覽器屬性的屬性的方法叫做BOM. 3.駝峰式命名(myMood)是函數(shù)名、方法名和對(duì)象屬性名的命名首選格式。 4.命名變量...
閱讀 1344·2021-09-23 11:51
閱讀 1517·2021-09-04 16:45
閱讀 679·2019-08-30 15:54
閱讀 2123·2019-08-30 15:52
閱讀 1676·2019-08-30 11:17
閱讀 3152·2019-08-29 13:59
閱讀 2079·2019-08-28 18:09
閱讀 430·2019-08-26 12:15