亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

javascript閉包的使用之按鈕切換功能

2024-05-06 16:45:53
字體:
來源:轉載
供稿:網友

閉包實現按鈕狀態切換

看下面的代碼:

var toggleBtn = document.getElementById('toggle');var toggleFun = (function() { var checked = true; return function() {  var color = checked ? 'red' : 'white';  toggleBtn.style.backgroundColor = color;  checked = !checked; };})();// 切換按鈕toggleBtn.addEventListener('click', toggleFun);

解釋

上面的代碼實現了點擊按鈕切換樣式的功能,它用到了js的閉包特性。簡單解釋下:

toggleFun為一個立即執行函數,執行后toggleFun被賦值為內部函數:

 toggleFun = function() {   color = checked ? 'red' : 'white';   toggleBtn.style.backgroundColor = color;   checked = !checked; }

這個函數用到了外部函數的checked變量,這也是checked變量在立即執行函數執行完成后未被銷毀的原因,因為還有其他地方用到了它。那么這個內部函數被用作事件監聽器的回調函數,每點擊一次就會被調用一次,從而可以通過更改checked的值來實現按鈕切換效果。立即執行函數內的函數被全局下的toggleFun變量引用了,這就創建了一個閉包。

簡而言之,閉包的作用就是在立即執行函數執行完并返回后,使得javascript的垃圾回收機制不會收回立即函數所占用的資源,因為立即執行函數的內部函數依賴立即執行函數中的變量。

額,上面寫的太啰嗦了,下面把代碼稍微改下,加些注釋就會更加清晰:

var toggleBtn = document.getElementById('toggle');var outerFun = function() { var checked = true; // innerFun聲明時用到了outerFun的局部變量 var innerFun = function() {  var color = checked ? 'red' : 'white';  toggleBtn.style.backgroundColor = color;  checked = !checked; }; return innerFun;};var toggleFun = outerFun(); // toggleFun指向innerFun// 切換按鈕,每次點擊都會調用innerFuntoggleBtn.addEventListener('click', toggleFun);

不用閉包,用全局變量

其實不用閉包也能實現按鈕切換,不過就得用到全局變量來存儲按鈕狀態:

var toggleBtn = document.getElementById('toggle');var checked = true; // 全局變量存儲按鈕狀態var toggleFun = function() { var color = checked ? 'red' : 'white'; toggleBtn.style.backgroundColor = color; checked = !checked;};toggleBtn.addEventListener('click', toggleFun);

但全局變量用多了會不好維護,代碼不好控制。

補充:JavaScript閉包的概念及用法

1.閉包的概念: 

 閉包就是能夠讀取其他函數內部變量的函數.

 例如:  

function f1(){    var n=999;    function f2(){      alert(n);     }    return f2;  }  var result=f1();  result(); // 999

 其中f2函數就是閉包。

 由于在Javascript語言中,只有函數內部的子函數才能讀取局部變量,

 因此可以把閉包簡單理解成"定義在一個函數內部的函數"。

 所以,在本質上,閉包就是將函數內部和函數外部連接起來的一座橋梁。

2.閉包的用途:

 閉包可以用在許多地方。它的最大用處有兩個,一個是前面提到的可以讀取函數內部的變量,

 另一個就是讓這些變量的值始終保持在內存中。

 怎么來理解這句話呢?請看下面的代碼。

  function f1(){    var n=999;    nAdd=function(){n+=1}    function f2(){      alert(n);    }    return f2;  }  var result=f1();  result(); // 999  nAdd();  result(); // 1000

 在這段代碼中,result實際上就是閉包f2函數。它一共運行了兩次,第一次的值是999,

 第二次的值是1000。這證明了,函數f1中的局部變量n一直保存在內存中,并沒有在f1調用后被自動清除。

 為什么會這樣呢?原因就在于f1是f2的父函數,而f2被賦給了一個全局變量,這導致f2始終在內存中,

 而f2的存在依賴于f1,因此f1也始終在內存中,不會在調用結束后,被垃圾回收機制(garbage collection)回收。

 這段代碼中另一個值得注意的地方,就是"nAdd=function(){n+=1}"這一行,

 首先在nAdd前面沒有使用var關鍵字,因此nAdd是一個全局變量,而不是局部變量。

 其次,nAdd的值是一個匿名函數(anonymous function),而這個匿名函數本身也是一個閉包,

 所以nAdd相當于是一個setter,可以在函數外部對函數內部的局部變量進行操作。

總結

以上所述是小編給大家介紹的javascript閉包的使用之按鈕切換功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美午夜久久久| 亚洲成人性视频| 青青草精品毛片| 揄拍成人国产精品视频| 国产成人一区二区三区小说| 欧美精品电影在线| 亚洲欧美日韩爽爽影院| 一本色道久久综合亚洲精品小说| 国产美女久久精品香蕉69| 欧洲永久精品大片ww免费漫画| 91午夜在线播放| www日韩中文字幕在线看| 亚洲精品日韩av| 国产精品国产自产拍高清av水多| 青青在线视频一区二区三区| 成人欧美在线视频| 成人免费大片黄在线播放| 亚洲激情第一页| 久久国产精品免费视频| 久久韩国免费视频| 91精品久久久久久久久中文字幕| 国产精品久久久久91| 色999日韩欧美国产| 欧美日韩国产成人在线| 91超碰caoporn97人人| 国产欧美精品久久久| 久久在线免费观看视频| 国产亚洲精品va在线观看| 欧美大学生性色视频| 97国产suv精品一区二区62| 在线激情影院一区| 欧美巨猛xxxx猛交黑人97人| 日韩精品电影网| 国产精品一久久香蕉国产线看观看| 久久综合色影院| 欧美成人午夜剧场免费观看| 亚洲欧美在线一区二区| 亚洲а∨天堂久久精品喷水| 亚洲女同性videos| 欧美久久精品午夜青青大伊人| 国产精品日韩欧美大师| 国色天香2019中文字幕在线观看| 欧美日韩亚洲国产一区| 色一区av在线| 日韩在线免费视频观看| 久久婷婷国产麻豆91天堂| 日本一区二三区好的精华液| 久久久精品免费视频| 亚洲国产精品一区二区三区| 精品呦交小u女在线| 亚洲国产成人久久综合| 亚洲韩国欧洲国产日产av| 日本一区二区在线播放| 热99精品里视频精品| 久久精品久久久久| 久久夜精品va视频免费观看| 欧美日韩国产在线| 欧美高清videos高潮hd| 国产v综合v亚洲欧美久久| 久久理论片午夜琪琪电影网| 色樱桃影院亚洲精品影院| 精品欧美aⅴ在线网站| 亚洲欧美国产日韩中文字幕| 一区二区三区黄色| 亚洲美女视频网站| 日本aⅴ大伊香蕉精品视频| 国产成人在线播放| 日av在线播放中文不卡| 国产精品久久97| 亚洲天堂影视av| 国内精品模特av私拍在线观看| 亚洲国产精品一区二区久| 日韩精品小视频| 国色天香2019中文字幕在线观看| 国产精品久久不能| 北条麻妃一区二区在线观看| 国产精品久久久久久久美男| 中文字幕亚洲无线码在线一区| 欧美片一区二区三区| 国产69久久精品成人| 欧美大片网站在线观看| 久久国产精品久久精品| 91po在线观看91精品国产性色| 久久久女人电视剧免费播放下载| 色噜噜亚洲精品中文字幕| 黑丝美女久久久| 中文字幕在线成人| 欧美亚洲国产成人精品| 97在线视频免费播放| 日韩精品在线观看网站| 日韩av在线免费观看| 亲子乱一区二区三区电影| 欧美激情xxxx| 亚洲一区制服诱惑| 久久精品久久久久久国产 免费| 日韩有码视频在线| 亚洲第一综合天堂另类专| 自拍偷拍免费精品| 欧美成在线观看| 性色av一区二区三区在线观看| 亚洲专区中文字幕| 福利精品视频在线| 韩国福利视频一区| 亚洲精品久久久久中文字幕二区| 国产不卡视频在线| 欧美激情亚洲视频| 日韩美女av在线免费观看| 国产精品自拍偷拍| 国产精品一区二区久久| 国产成人精品视| 欧美福利视频在线观看| 欧美成人午夜激情视频| 亚洲欧美一区二区精品久久久| 国产精品久久久久久久久久小说| 91香蕉电影院| 日韩中文字幕在线看| 欧美成人精品不卡视频在线观看| 亚洲国产美女精品久久久久∴| 欧美孕妇与黑人孕交| 一区二区三区在线播放欧美| 欧美色视频日本高清在线观看| 91色视频在线导航| 国产香蕉精品视频一区二区三区| 懂色aⅴ精品一区二区三区蜜月| 久久亚洲影音av资源网| 欧美美女操人视频| 亚洲电影免费观看高清完整版| 亚洲人成网站免费播放| 久久精品国产精品| 91视频国产一区| 久国内精品在线| 日韩在线视频免费观看| 精品亚洲永久免费精品| 欧美日韩成人在线视频| 久久久久免费精品国产| 最近2019年手机中文字幕| 精品福利在线观看| 欧洲亚洲女同hd| 91精品国产综合久久久久久久久| 国产69久久精品成人看| 亚洲欧洲在线播放| 亚洲欧美一区二区精品久久久| 久久精品99久久久久久久久| 九色精品免费永久在线| 精品视频—区二区三区免费| 欧美激情久久久久| 91久久久国产精品| 亚洲国产精品悠悠久久琪琪| 日韩av免费在线观看| 亚洲天堂av在线免费观看| 色综合伊人色综合网| 成人免费午夜电影| 欧美日韩国产成人在线| 日韩美女在线观看| 亚洲美女av黄| 亚洲精品v天堂中文字幕| 欧美激情在线观看视频| 亚洲精品之草原avav久久| 日韩在线中文视频| 日韩欧美中文字幕在线播放| 欧美高清在线视频观看不卡| 亚洲伊人第一页| 久久久91精品国产| 亚洲福利视频在线|