<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [JavaScript]使用閉包實(shí)現(xiàn)點(diǎn)擊按鈕切換 toggle

      前言

      • 我以往在實(shí)現(xiàn)點(diǎn)擊按鈕切換DOM元素樣式的時(shí)候,使用的是在全局范圍內(nèi)定義一個(gè)flag變量,然后用true和false來(lái)對(duì)應(yīng)不同的狀態(tài)。
      const btn = document.querySelector('#btn');	//獲取按鈕元素
      let flag = false;	//flag是全局變量
      
      //事件監(jiān)聽(tīng)綁定點(diǎn)擊事件
      btn.addEventListener('click',function(){
      	if(flag){
      		//狀態(tài)1
      	}else{
      		//狀態(tài)2
      	}
      	flag = !flag;	//切換狀態(tài)(通過(guò)修改flag的值:true或false)
      });
      
      //...如果代碼量很多的話,我們可能在其他地方不小心使用著同樣叫做flag的變量
      
      flag = doSomethingToFlag();	//其他代碼可能對(duì)flag的值進(jìn)行了(意料之外的)修改
      
      • 這個(gè)flag變量其實(shí)本意上只是用在按鈕的點(diǎn)擊事件上,但是flag位于全局范圍內(nèi),其他代碼都可以對(duì)flag的值進(jìn)行修改,從而可能導(dǎo)致意料之外的情況發(fā)生。因此,使用全局變量表示不同狀態(tài)是不可取的做法。
      • 最近在學(xué)習(xí)閉包的概念,嘗試著使用閉包實(shí)現(xiàn)點(diǎn)擊按鈕切換不同狀態(tài)。

      分析

      • 使用閉包我們可以把表示狀態(tài)的flag變成私有變量。
      const btn = document.querySelector('#btn');	//獲取按鈕元素
      
      function click(){
      	let flag = true;	//這里的flag不再是全局變量
      
      	function closure(){
      		if(flag){
      			console.log('on');	//這里表示狀態(tài)1
      		}else{
      			console.log('off');	//這里表示狀態(tài)2
      		}
      		flag = !flag;	//切換狀態(tài)
      	}
      	return closure;
      }
      
      btn.addEventListener('click',click());	//綁定點(diǎn)擊事件
      
      console.log(flag);	//報(bào)錯(cuò):flag is not defined
      

      我們?cè)?code>click()函數(shù)內(nèi)部定義了closure()函數(shù),當(dāng)closure()函數(shù)被返回并在其他地方被使用后,它仍然引用著flag,這就導(dǎo)致了click()函數(shù)被銷(xiāo)毀,但是flag不會(huì)被銷(xiāo)毀,也就是形成了閉包。

      • 這里稍微對(duì)代碼做一些改進(jìn),使其復(fù)用性更高,也就是封裝toggle()函數(shù):
      //toggle()函數(shù)接收一個(gè)按鈕和兩個(gè)函數(shù):on()和off();
      //其中on()表示第1種狀態(tài)要執(zhí)行的內(nèi)容,off()表示第2種狀態(tài)要執(zhí)行的內(nèi)容
      function toggle(btn, on, off) {
      	//使用閉包
      	function click() {
      		let flag = true;
      
      		function closure() {
      			if (flag) {
      				on();//這里執(zhí)行狀態(tài)1要執(zhí)行的內(nèi)容
      			} else {
      				off();//這里執(zhí)行狀態(tài)2要執(zhí)行的內(nèi)容
      			}
      			flag = !flag;
      		}
      
      		return closure;
      	}
      
      	//為按鈕綁定點(diǎn)擊事件
      	btn.addEventListener('click', click());
      }
      
      • 將功能封裝好后,就可以很方便的將toggle事件綁定到按鈕上:
      const btn = document.querySelectorAll('.btn');	//獲取若干個(gè)按鈕
      
      for (let i = 0; i < btn.length; i++) {//使用for循環(huán)為這些按鈕都綁定toggle事件
      	//toggle函數(shù)的三個(gè)參數(shù)分別是:按鈕DOM元素、狀態(tài)1要執(zhí)行的內(nèi)容、狀態(tài)2要執(zhí)行的內(nèi)容
      	toggle(btn[i],
      	function on() {
      		//doSomething:這里填入狀態(tài)1要執(zhí)行的代碼
      	},
      	function off() {
      		//doSomething:這里填入狀態(tài)2要執(zhí)行的代碼
      	});
      }
      
      • 經(jīng)過(guò)測(cè)試可以發(fā)現(xiàn),各個(gè)按鈕對(duì)應(yīng)的flag是獨(dú)立的,互不干擾的。這是因?yàn)椋?/li>
      1. 每一次綁定點(diǎn)擊事件時(shí),toggle()函數(shù)內(nèi)部的click()函數(shù)占有一定內(nèi)存空間,而函數(shù)調(diào)用后,內(nèi)存被回收,flag由于閉包的特性被保留下來(lái);
      2. 又因?yàn)槊看握{(diào)用click()函數(shù)開(kāi)辟的是不同的內(nèi)存空間,因此內(nèi)部對(duì)應(yīng)的flag也是不同的,故每一個(gè)按鈕都能和一個(gè)flag一一對(duì)應(yīng),不會(huì)互相干擾。

      參考文章

      [1] JavaScript閉包 | 菜鳥(niǎo)教程
      [2] 閉包 - JavaScript | MDN
      [3] JavaScript高級(jí)程序設(shè)計(jì)(第4版) [美] 馬特·弗里斯比(Matt Frisbie)——10.14 閉包

      posted @ 2022-07-01 21:07  feixianxing  閱讀(353)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲欧美综合人成在线| 免费人成视频在线| 国产精品自在线拍国产手青青机版| 高清不卡一区二区三区| 国产精品国产三级国产午| 亚洲熟女乱色综合一区 | 国产亚洲精品综合一区二区| 在国产线视频A在线视频| 日韩精品中文字幕无码一区| 精品国产成人午夜福利| 亚洲一区成人在线视频| 高清性欧美暴力猛交| 人妻内射一区二区在线视频| 人妻日韩人妻中文字幕| 好了av四色综合无码| 国产午夜美女福利短视频| 成人国产精品日本在线观看| 国产av一区二区不卡| 日本伊人色综合网| 无套内谢少妇一二三四| 国产真实野战在线视频| 深夜福利成人免费在线观看| 亚洲欧洲日韩精品在线| 69人妻精品中文字幕| 国产精品无遮挡猛进猛出| caoporn免费视频公开| 国内精品伊人久久久久av| 一区二区三区四区自拍偷拍| 麻豆最新国产AV原创精品| 中文字幕av国产精品| 日韩大尺度一区二区三区| 精品无人乱码一区二区三区的优势 | 亚洲一区二区三区激情在线| 亚洲欧洲无码av电影在线观看| 欧美成人无码a区视频在线观看| 农村妇女野外一区二区视频| 日韩精品一区二区午夜成人版| 99中文字幕国产精品| 国产精品日韩中文字幕熟女| 国产精品中文字幕视频| 国产极品视频一区二区三区|