摘要:把開辟的堆內(nèi)存的進(jìn)制的地址賦值給函數(shù)名。閉包有個(gè)作用一個(gè)是保護(hù)其私有作用域的私有變量不受外界干擾,另一個(gè)作用就是可以保存以下內(nèi)容。
使用下面的幾種方法都可以實(shí)現(xiàn)我們想要的效果。下面我一一進(jìn)行描述講解下。 首先我們需要弄清楚一個(gè)問題,下面的代碼(方法0:)為什么不可以實(shí)現(xiàn)我們想要的效果,而且邏輯上好像也沒有什么問題。
方法0:
for (var i = 0;i < tabList.length; i++){ tabList[i].onclick = function () { console.dir(this); changeTabHandle(i); } }
如果想弄懂這個(gè)問題我們需要知道函數(shù)在瀏覽器中的操作原理。函數(shù)操作分為2個(gè)階段:函數(shù)創(chuàng)建和函數(shù)執(zhí)行。
【函數(shù)創(chuàng)建】會(huì)經(jīng)歷下面幾個(gè)過程。
函數(shù)屬于引用類型的,首先會(huì)開辟一個(gè)堆內(nèi)存,把函數(shù)體中的代碼當(dāng)作字符串存儲(chǔ)在這個(gè)對(duì)內(nèi)存中,為了找到這個(gè)內(nèi)置,瀏覽器會(huì)為其分配一個(gè)16進(jìn)制的地址。在我們上面的代碼中會(huì)把“console.dir(this);changeTabHandle(i);”存儲(chǔ)在對(duì)內(nèi)存中。
把開辟的堆內(nèi)存的16進(jìn)制的地址賦值給函數(shù)名。
【函數(shù)執(zhí)行】會(huì)經(jīng)歷下面幾個(gè)過程。
函數(shù)執(zhí)行首先會(huì)形成一個(gè)私有的作用域(棧內(nèi)存)
把之前存儲(chǔ)在堆內(nèi)存中的代碼字符串復(fù)制一份過來,變成js代碼,從上到下依次執(zhí)行。
方法0不可行的原因是,進(jìn)入循環(huán)體后,把字符串拷貝到堆內(nèi)存中,i依然在加1,當(dāng)點(diǎn)擊按鈕出發(fā)函數(shù)執(zhí)行的時(shí)候,1已經(jīng)變成了tabList.length.既然知道了原因,那怎么解決這個(gè)問題呢?我們依次來看下面幾個(gè)方法。
方法1-3中使用的changeTabHandle函數(shù)
//n 當(dāng)前點(diǎn)擊按鈕的索引 function changeTabHandle(n) { for(var i=0; i
自定義屬性名
//方法一:自定義屬性方法,把當(dāng)前的i存在我們獲取的對(duì)象上面。讓對(duì)象的一個(gè)屬性(_f_index)把當(dāng)前按鈕的索引保存下來。
console.log(tabList);
for (var i = 0;i < tabList.length; i++){tabList[i]._f_index = i; tabList[i].onclick = function () { console.dir(this); changeTabHandle(this._f_index); }}
es6 let
//方法二:var --> let,利用了es6中l(wèi)et塊級(jí)作用域的概念。
for(let i=0; i tabList[i].onclick = function() { changeTabHandle(i); }}
閉包
//下面2個(gè)方法都是利用了閉包的保存作用。閉包有2個(gè)作用一個(gè)是保護(hù)其私有作用域的私有變量不受外界干擾,另一個(gè)作用就是可以保存以下內(nèi)容。下面幾種方法都可以讓函數(shù)自制行
(function(){})()
~function()()
!function()()
+function()()
方法一:for(var i=0; i方法二:
for(var i=0; i
記憶上次是那個(gè)被選中而不是全部清空+自定義屬性
beforeIndex = 0;
for(var i=0; i tabList[i]._f_index = i; tabList[i].onclick = function() { tabList[beforeIndex].className = ""; divList[beforeIndex].className = ""; tabList[this._f_index].className = "active"; divList[this._f_index].className = "active"; beforeIndex = this._f_index; }}
5.記憶上次是那個(gè)被選中而不是全部清空+let
for(let i=0; igithub 實(shí)例代碼 https://github.com/fung-yu/js... 中的tab篇
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98392.html
摘要:從上面那段代碼可以看到,下的上外邊距只占了兩個(gè)距離的一半,所以兩個(gè)的間距是。下面分別對(duì)第和第個(gè)條件進(jìn)行了測(cè)試。關(guān)于這一點(diǎn),兩個(gè)元素的間距是這樣計(jì)算的上的下外邊距包裹上的下內(nèi)邊距下的上外邊距可以看下面這個(gè)例子印證第三點(diǎn)。 昨天面了html5前端。下面是其中3個(gè)問題: 雙外邊距疊加。 用原生js怎么實(shí)現(xiàn)div選項(xiàng)卡。 如何去實(shí)現(xiàn)一個(gè)插件。 一、雙外邊距折疊 問題描述 一上一下兩個(gè)di...
摘要:從上面那段代碼可以看到,下的上外邊距只占了兩個(gè)距離的一半,所以兩個(gè)的間距是。下面分別對(duì)第和第個(gè)條件進(jìn)行了測(cè)試。關(guān)于這一點(diǎn),兩個(gè)元素的間距是這樣計(jì)算的上的下外邊距包裹上的下內(nèi)邊距下的上外邊距可以看下面這個(gè)例子印證第三點(diǎn)。 昨天面了html5前端。下面是其中3個(gè)問題: 雙外邊距疊加。 用原生js怎么實(shí)現(xiàn)div選項(xiàng)卡。 如何去實(shí)現(xiàn)一個(gè)插件。 一、雙外邊距折疊 問題描述 一上一下兩個(gè)di...
摘要:從上面那段代碼可以看到,下的上外邊距只占了兩個(gè)距離的一半,所以兩個(gè)的間距是。下面分別對(duì)第和第個(gè)條件進(jìn)行了測(cè)試。關(guān)于這一點(diǎn),兩個(gè)元素的間距是這樣計(jì)算的上的下外邊距包裹上的下內(nèi)邊距下的上外邊距可以看下面這個(gè)例子印證第三點(diǎn)。 昨天面了html5前端。下面是其中3個(gè)問題: 雙外邊距疊加。 用原生js怎么實(shí)現(xiàn)div選項(xiàng)卡。 如何去實(shí)現(xiàn)一個(gè)插件。 一、雙外邊距折疊 問題描述 一上一下兩個(gè)di...
摘要:通常寫代碼時(shí)我們無需主動(dòng)調(diào)用或是因?yàn)樵谕獠繉?duì)我們的回調(diào)函數(shù)做了包裝。類似的不只是這些事件回調(diào)函數(shù),還有等。常量依舊會(huì)重復(fù)檢查。會(huì)檢查中有沒有一個(gè)名為的成員。 TL;DR 臟檢查是一種模型到視圖的數(shù)據(jù)映射機(jī)制,由 $apply 或 $digest 觸發(fā)。 臟檢查的范圍是整個(gè)頁面,不受區(qū)域或組件劃分影響 使用盡量簡(jiǎn)單的綁定表達(dá)式提升臟檢查執(zhí)行速度 盡量減少頁面上綁定表達(dá)式的個(gè)數(shù)(單次綁定...
摘要:通常寫代碼時(shí)我們無需主動(dòng)調(diào)用或是因?yàn)樵谕獠繉?duì)我們的回調(diào)函數(shù)做了包裝。類似的不只是這些事件回調(diào)函數(shù),還有等。常量依舊會(huì)重復(fù)檢查。會(huì)檢查中有沒有一個(gè)名為的成員。 TL;DR 臟檢查是一種模型到視圖的數(shù)據(jù)映射機(jī)制,由 $apply 或 $digest 觸發(fā)。 臟檢查的范圍是整個(gè)頁面,不受區(qū)域或組件劃分影響 使用盡量簡(jiǎn)單的綁定表達(dá)式提升臟檢查執(zhí)行速度 盡量減少頁面上綁定表達(dá)式的個(gè)數(shù)(單次綁定...
閱讀 2510·2021-11-25 09:43
閱讀 2622·2021-11-16 11:50
閱讀 3305·2021-10-09 09:44
閱讀 3227·2021-09-26 09:55
閱讀 2853·2019-08-30 13:50
閱讀 1036·2019-08-29 13:24
閱讀 2100·2019-08-26 11:44
閱讀 2810·2019-08-26 11:37