• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

JavaScript中子函数访问外部变量的3种解决方法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

前言

我们在写web页面时,肯定会经常遇到下面这种情况:

<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('点击按钮:' + i);
 });
}
</script>
  
</body>

代码很简单,就是在页面上创建几个按钮,同时定义按钮的点击事件

可当点击按钮时,我们发现获取到的序号一直都是5,也就是 i 最后的值。

这是因为定义click事件时的匿名函数所引用的都是同一个变量 i

解决办法1:立即执行

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('点击按钮:' + i);
 //});

 //方法1:立即执行
 btn.on('click', (function(n){
  return function(evt){
   console.log('点击按钮:' + n);
  }
 })(i));

}

这种方式就是在定义事件时直接为每个按钮都创建了一个独立的匿名函数(闭包),并且每个函数都持有正确的 i 变量

解决办法2:利用jquery的事件传参

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('点击按钮:' + i);
 //});

 //方法2:利用JQuery的事件传参
 btn.on('click', { i: i }, function(evt){
  console.log('点击按钮:' + evt.data.i);
 });

}

这种办法就简单多了,直接利用jquery将参数体传递给匿名函数即可。

解决办法3:利用dom的data属性

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('点击按钮:' + i);
 //});

 //方法3:利用dom的data属性
 btn.data('i', i);
 btn.on('click', function(evt){
  console.log('点击按钮:' + $(this).data('i'));
 });

}

这种方法也很简单,弊端就是无法利用data属性定义结构化的数据。

总结 

综合来看,如果是jquery环境,利用事件参数来转递变量是最简单的,而且可以传递结构化的数据。

否则只能通过立即执行(闭包)的方式。

到此这篇关于JavaScript中子函数访问外部变量的文章就介绍到这了,更多相关JS子函数访问外部变量内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界!


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
浅谈node使用jwt生成的token应该存在哪里发布时间:2022-02-05
下一篇:
深入理解typescript中的infer关键字的使用发布时间:2022-02-05
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap