JavaScript中子函數(shù)訪問外部變量的3種解決方法
前言
我們在寫web頁面時,肯定會經(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>
代碼很簡單,就是在頁面上創(chuàng)建幾個按鈕,同時定義按鈕的點(diǎn)擊事件

可當(dāng)點(diǎn)擊按鈕時,我們發(fā)現(xiàn)獲取到的序號一直都是5,也就是 i 最后的值。
這是因?yàn)槎xclick事件時的匿名函數(shù)所引用的都是同一個變量 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));
}
這種方式就是在定義事件時直接為每個按鈕都創(chuàng)建了一個獨(dú)立的匿名函數(shù)(閉包),并且每個函數(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);
});
}
這種辦法就簡單多了,直接利用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'));
});
}
這種方法也很簡單,弊端就是無法利用data屬性定義結(jié)構(gòu)化的數(shù)據(jù)。
總結(jié)
綜合來看,如果是jquery環(huán)境,利用事件參數(shù)來轉(zhuǎn)遞變量是最簡單的,而且可以傳遞結(jié)構(gòu)化的數(shù)據(jù)。
否則只能通過立即執(zhí)行(閉包)的方式。
到此這篇關(guān)于JavaScript中子函數(shù)訪問外部變量的文章就介紹到這了,更多相關(guān)JS子函數(shù)訪問外部變量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于JavaScript實(shí)現(xiàn)彈出框效果
彈出框在網(wǎng)站頁面中是必不可少的一部分,今天借助腳本之家平臺給大家分享使用js實(shí)現(xiàn)簡單的彈出框效果,感興趣的朋友一起學(xué)習(xí)吧2016-02-02
使用SpreadJS快速清除Excel中工作表保護(hù)密碼
這篇文章主要為大家介紹了使用SpreadJS快速清除Excel中工作表保護(hù)密碼方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
javascript中兼容主流瀏覽器的動態(tài)生成iframe方法
這篇文章主要介紹了javascript中兼容主流瀏覽器的動態(tài)生成iframe方法,需要的朋友可以參考下2014-05-05
JS 獲取span標(biāo)簽中的值的代碼 支持ie與firefox
JS獲取span標(biāo)簽中的值的代碼,在實(shí)際應(yīng)用中經(jīng)常用的到的功能,原理很簡單,大家可以拓展下。2009-08-08
js使用setTimeout實(shí)現(xiàn)定時炸彈的方法
這篇文章主要介紹了js使用setTimeout實(shí)現(xiàn)定時炸彈的方法,涉及javascript中setTimeout方法的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04
hash特點(diǎn)、hashchange事件介紹及其常見應(yīng)用場景
淺析hash特點(diǎn)、hashchange事件介紹及其常見應(yīng)用場景(不同hash對應(yīng)不同事件處理、移動端大圖展示狀態(tài)后退頁面問題、原生輕應(yīng)用頭部后退問題、移動端自帶返回按鈕二次確認(rèn)問題),hashchange和popstate事件觸發(fā)條件2023-11-11
利用JavaScript實(shí)現(xiàn)ISO周日歷
周日歷是日常生活中不常用到的歷法系統(tǒng),一般用于政府、商務(wù)的會計年度或者學(xué)校教學(xué)日歷中。本文將利用JavaScript制作個簡單的周日歷,感興趣的可嘗試一下2022-07-07

