国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 15:30:55
字體:
來源:轉載
供稿:網友

閉包實現按鈕狀態切換

看下面的代碼:

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            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 武宁县| 平遥县| 南开区| 武定县| 讷河市| 柳州市| 梨树县| 洛阳市| 康乐县| 上饶市| 广东省| 临泽县| 开鲁县| 无极县| 大石桥市| 宜黄县| 车险| 安化县| 松滋市| 浦江县| 密云县| 东安县| 奇台县| 郎溪县| 张掖市| 东莞市| 莫力| 大悟县| 江北区| 清流县| 利津县| 凌云县| 璧山县| 信宜市| 巴楚县| 眉山市| 马鞍山市| 库尔勒市| 郴州市| 洛扎县| 宁海县|