JavaScript中子函數(shù)訪問(wèn)外部變量的3種解決方法
前言
我們?cè)趯?xiě)web頁(yè)面時(shí),肯定會(huì)經(jīng)常遇到下面這種情況:
<body> <div class="btns-wrapper"></div> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script> var wrapper = $('.btns-wrapper'); for(var i = 0; i < 5; i++){ var btn = $('<button>按鈕' + i + '</button>').appendTo(wrapper); btn.on('click', function(evt){ console.log('點(diǎn)擊按鈕:' + i); }); } </script> </body>
代碼很簡(jiǎn)單,就是在頁(yè)面上創(chuàng)建幾個(gè)按鈕,同時(shí)定義按鈕的點(diǎn)擊事件
可當(dāng)點(diǎn)擊按鈕時(shí),我們發(fā)現(xiàn)獲取到的序號(hào)一直都是5,也就是 i 最后的值。
這是因?yàn)槎xclick事件時(shí)的匿名函數(shù)所引用的都是同一個(gè)變量 i
解決辦法1:立即執(zhí)行
var wrapper = $('.btns-wrapper'); for(var i = 0; i < 5; i++){ var btn = $('<button>按鈕' + i + '</button>').appendTo(wrapper); //默認(rèn)方法 //btn.on('click', function(evt){ // console.log('點(diǎn)擊按鈕:' + i); //}); //方法1:立即執(zhí)行 btn.on('click', (function(n){ return function(evt){ console.log('點(diǎn)擊按鈕:' + n); } })(i)); }
這種方式就是在定義事件時(shí)直接為每個(gè)按鈕都創(chuàng)建了一個(gè)獨(dú)立的匿名函數(shù)(閉包),并且每個(gè)函數(shù)都持有正確的 i 變量
解決辦法2:利用jquery的事件傳參
var wrapper = $('.btns-wrapper'); for(var i = 0; i < 5; i++){ var btn = $('<button>按鈕' + i + '</button>').appendTo(wrapper); //默認(rèn)方法 //btn.on('click', function(evt){ // console.log('點(diǎn)擊按鈕:' + i); //}); //方法2:利用JQuery的事件傳參 btn.on('click', { i: i }, function(evt){ console.log('點(diǎn)擊按鈕:' + evt.data.i); }); }
這種辦法就簡(jiǎn)單多了,直接利用jquery將參數(shù)體傳遞給匿名函數(shù)即可。
解決辦法3:利用dom的data屬性
var wrapper = $('.btns-wrapper'); for(var i = 0; i < 5; i++){ var btn = $('<button>按鈕' + i + '</button>').appendTo(wrapper); //默認(rèn)方法 //btn.on('click', function(evt){ // console.log('點(diǎn)擊按鈕:' + i); //}); //方法3:利用dom的data屬性 btn.data('i', i); btn.on('click', function(evt){ console.log('點(diǎn)擊按鈕:' + $(this).data('i')); }); }
這種方法也很簡(jiǎn)單,弊端就是無(wú)法利用data屬性定義結(jié)構(gòu)化的數(shù)據(jù)。
總結(jié)
綜合來(lái)看,如果是jquery環(huán)境,利用事件參數(shù)來(lái)轉(zhuǎn)遞變量是最簡(jiǎn)單的,而且可以傳遞結(jié)構(gòu)化的數(shù)據(jù)。
否則只能通過(guò)立即執(zhí)行(閉包)的方式。
到此這篇關(guān)于JavaScript中子函數(shù)訪問(wèn)外部變量的文章就介紹到這了,更多相關(guān)JS子函數(shù)訪問(wèn)外部變量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript算法題 求任意一個(gè)1-9位不重復(fù)的N位數(shù)在該組合中的大小排列序號(hào)
從1--9中選取N個(gè)數(shù)字,組成不重復(fù)的N位數(shù),從小到大進(jìn)行編號(hào),當(dāng)輸入其中任何一個(gè)數(shù)M時(shí),能找出該數(shù)字對(duì)應(yīng)的編號(hào)2012-07-07JavaScript中 創(chuàng)建動(dòng)態(tài) QML 對(duì)象的方法
這篇文章主要介紹了 JavaScript中 創(chuàng)建動(dòng)態(tài) QML 對(duì)象,下面文章主要分析了兩中方法,分別是從 QML 字符串創(chuàng)建對(duì)象和動(dòng)態(tài)創(chuàng)建組件以及刪除對(duì)象等方法,具有有一定的參考價(jià)值,需要的小伙伴可以參考一下2021-12-12BootStrap selectpicker后臺(tái)動(dòng)態(tài)綁定數(shù)據(jù)的方法
這篇文章主要為大家詳細(xì)介紹了BootStrap selectpicker后臺(tái)動(dòng)態(tài)綁定數(shù)據(jù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07JavaScript設(shè)計(jì)模式之職責(zé)鏈模式詳解
職責(zé)鏈模式的定義是:使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系,將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止2022-08-08自己使用js/jquery寫(xiě)的一個(gè)定制對(duì)話框控件
自己做一個(gè)通用的控件,雖然不是絕對(duì)通用啦,但在我這個(gè)項(xiàng)目里還是可以隨意調(diào)用的,思想的話也可以借鑒到別的項(xiàng)目中2014-05-05