JS函数访问外部变量的方法有哪些?

Admin 2021-09-06 群英技术资讯 1697 次浏览

    JS函数访问外部变量的方法有哪些?其实任何在函数中定义的变量都可认为是私有变量,因为是不能在函数外部访问这些变量的,但是我们可以通用JavaScript中子函数访问外部变量,下文给大家分享了三种方法,感兴趣的朋友可以参考。

    前言

    我们在写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环境,利用事件参数来转递变量是最简单的,而且可以传递结构化的数据。否则只能通过立即执行(闭包)的方式。

    关于js函数访问外部变量的方法就介绍到这,上述三种方法具有一定的借鉴价值,感兴趣的朋友可以参考学习,希望能对大家有帮助,想要了解更多大家可以关注群英网络其它相关文章。

文本转载自脚本之家

群英智防CDN,智能加速解决方案

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

猜你喜欢

成为群英会员,开启智能安全云计算之旅

立即注册
专业资深工程师驻守
7X24小时快速响应
一站式无忧技术支持
免费备案服务
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
在线客服
微信公众号
返回顶部
返回顶部 返回顶部
在线客服
在线客服