javascript如何建立一个静态变量(JavaScript中子函数访问外部变量的3种解决方法)
类别:编程学习 浏览量:1658
时间:2021-10-21 07:26:11 javascript如何建立一个静态变量
JavaScript中子函数访问外部变量的3种解决方法前言
我们在写web页面时,肯定会经常遇到下面这种情况:
<body> <li class="btns-wrapper"></li> <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子函数访问外部变量内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
您可能感兴趣
- 自己做的弹珠小游戏(JS实现简单打砖块弹球小游戏)
- js图片水印库(js给图片打马赛克的方法示例)
- extjs anchor 锚点布局
- pythonjson格式化原理(详解pythonstr与json类型转换)
- nodejs实现websocket服务端(Node.js+express+socket实现在线实时多人聊天室)
- js字符串常用函数
- php加密平台(PHP7实现和CryptoJS的AES加密方式互通示例AES-128-ECB加密)
- js的逻辑关系和思路(js Proxy的原理详解)
- js三级联动列表(基于JavaScript实现年月日三级联动)
- JS中sort()和reverse()
- js中encodeURIComponent与C#中HttpUtility.UrlEncode
- php验证码图解(php/JS实现的生成随机密码验证码功能示例)
- nodejs请求页面(node.js+postman实现模拟HTTP服务器与客户端交互)
- 禁止鼠标右键的JS代码
- js操作iframe
- mysql中json的支持(MySQL中json字段的操作方法)
- 四月新番CP人气榜公布,《剃须》两度上榜,沙优不是女朋友(四月新番CP人气榜公布)
- 2019年外媒秋季新番动画角色CP排行榜,桐人和爱丽丝落榜(2019年外媒秋季新番动画角色CP排行榜)
- 新一小兰领衔 盘点动漫中的那些 远距离恋爱情侣(盘点动漫中的那些)
- 大事件 合肥四中火了(大事件合肥四中火了)
- 翼龙贷组织出借人调研 感受鄱阳 借 来的致富路(翼龙贷组织出借人调研)
- 2023新国风戏曲教育寒假集训班汇报演出《戏娃闹元宵》图文报道(2023新国风戏曲教育寒假集训班汇报演出戏娃闹元宵图文报道)
热门推荐
- dedecms标签怎么调用(dedecms织梦系统内容页英文字母不换行的解决方法)
- 为什么css中float:right后右对齐换行
- sqlserver语句创建窗口布局(SQL Server 2012 开窗函数)
- sqlserver多表查询(sqlserver 树形结构查询单表实例代码)
- php加密平台(PHP7实现和CryptoJS的AES加密方式互通示例AES-128-ECB加密)
- docker容器退出错误码的步骤(docker容器退出错误码的步骤)
- css3按钮闪烁(纯CSS3代码实现switch滑动开关按钮效果)
- js实现CSS格式化和压缩
- web.config自定义配置节点,将多个节点合并
- pythonmatplotlib实例(Python3使用Matplotlib 绘制精美的数学函数图形)