理解 立即执行函数
时间:2021-10-11
本文章向大家介绍理解 立即执行函数,主要包括理解 立即执行函数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
概念:
声明一个函数,并马上调用这个匿名函数就叫做立即执行函数。
声明方式:
//第一种:用括号把整个函数定义和调用包裹起来
(function(){
//function body
}())
//第二种:用括号把函数定义包裹起来,后面再加括号
(function (){
//function body
})()
作用:
创建一个独立的作用域,这个作用域里面的变量,外面访问不到,即避免「变量污染」。
分析下面代码:
<ul id="list"> <li>1</li> <li>2</li> <li>3</li> </ul> <script> var list = document.getElementById("list"); var li = list.children; for (var i = 0; i < li.length; i++) { li[i].onclick = function() { console.log(i); // 结果总是3.而不是0,1,2 } } </script>
解析:因为i是贯穿整个作用域的,而不是给每一个li分配一个i,点击事件使异步,用户一定是在for运行完了以后,才点击,此时i已经变成3了。
那么该如何解决这个问题:
// 使用立即执行函数
var list = document.getElementById("list");
var li = list.children;
for (var i = 0; i < li.length; i++) {
(function(j) {
li[j].onclick = function() {
console.log(j);
}
})(i)
}
如果立即执行函数中需要全局变量,全局变量会被作为一个参数传递给立即执行函数(上例中的i就是一个全局变量,i代表的是实参,j是i在立即执行函数中的形参)。
// 或者使用ES6的块级作用域
var list = document.getElementById("list");
var li = list.children;
for (let i = 0; i < li.length; i++) {
li[i].onclick = function() {
console.log(i);
}
}
应用场景:
- 改变变量作用域;
上述代码就是改变变量作用域,一个很好的例子。
- 封装临时变量;
加载只需要执行一次的代码,比如显示时间。这些代码也需要一些临时的变量,但是初始化过程结束之后,就再也不会被用到。这些变量不适合作为全局变量,产生初始化代码遗留。可以用立即执行函数将所有的代码包裹在它的局部作用域中,这些变量都不会在全局变量中存在,以后也不会其他地方使用,有效的避免了污染全局变量。
原文地址:https://www.cnblogs.com/HuiTaiLang1216/p/15394225.html
- golang调试工具Delve
- Git 项目推荐 | 分布式系统唯一 ID 生成方法
- keepalived双机热备nginx
- Git 项目推荐 | 开源 PHP 加密运行扩展
- Git 项目推荐 | 基于 J2Cache 的多级缓存框架
- 如何将生产环境的字段类型从INT修改为BIGINT
- 如何高效的使用PowerShell备份数据库
- Git 项目推荐 | Java 版按键精灵
- Elasticsearch-精确查找
- Git 项目推荐 | 图片验证码生成库
- Elasticsearch-深入理解索引原理
- Git 项目推荐 | html5 异步批量上传插件
- 老司机带你过常规WAF
- Git 项目推荐 | javascript ajax 代理调用工具
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一天一大 leet(有序矩阵中第 K 小的元素)难度:中等-Day20200702
- 一天一大 leet (126. 单词接龙 II)
- BigData--Yarn资源调度器
- 一天一大 leet(最长有效括号)难度:困难-Day20200704
- BigData--Zookeeper介绍和使用
- 一天一大 leet(通配符匹配)难度:困难-Day20200705
- 日志框架,选择Logback Or Log4j2?
- django-rest-framework配置json web token进行接口的认证
- spring中的SpEL表达式
- 京喜小程序首页无障碍优化实践
- 几种排序算法
- 一天一大 leet(转变数组后最接近目标值的数组和)难度:中等 DAY-14
- 推荐一个生成后端模拟数据的懒人工具:lazy-mock
- django-rest-framework框架学习
- 弄懂这 5 个问题,拿下 Python 迭代器!