IIFE
IIFE: immediately-invoked function expression,立即调用函数表达式,函数在定义的时候,立即执行,是一种语法。
前置知识
了解函数声明和函数表达式的区别
- 以 function 开头的就是函数声明
- 痛过赋值给变量的就是函数表达式
例子:
function a() {} // 函数声明
var a = function () {}; // 函数表达式
形式
(function () {})(); // 形式1
(function () {}()); // 形式2
+function () {}(); // 形式3
-function () {}(); // 形式4
!function () {}(); // 形式5
~function () {}(); // 形式6
- 声明一个函数,一般是匿名函数,因为立即执行函数是不需要名字的
- 将函数声明转换成函数表达式,可以使用下面四个一元运算符(只用一个操作数):+ - ! ~(按位取反运算符),或者用小括号包裹起来
- 让表达式执行,在表达式后面添加小括号让函数立即执行
作用
- 不需要为函数命名,避免污染全局变量
- 创建一个独立作用域,这个作用域里面的变量外界访问不到,避免污染全局变量
使用场景
- 页面加载完后,需要立即执行一些初始化设置,例如事件处理,创建对象等
- 在应用中只执行一次的代码
闭包
这个知识点来来回回总结了好多次,主要自己没有一个太明确的概念,而且再工作中用的场景也很好,后面遇到再好好补充。
闭包:在函数外部访问函数内部的变量的函数,就是闭包,正常情况下在函数外部是访问不到函数内部变量的。
举个例子
function a() {
let i = 0;
}
console.log(i); // ReferenceError: i is not defined
在外部访问会报错,对吧,因为根据作用域链的规则,只能是函数内部能访问外部的变量,那我现在有一个需求,我就想访问内部的变量,怎么办,这个时候就可以使用闭包了。既然内部可以访问外部的变量,那我就在内部定义一个函数,去访问这个变量,然后我再把这个函数给返回出去不久可以了。
function a() {
let i = 0;
return function b() {
console.log(i);
}
}
let c = a();
c(); // 0
这个改造一下,这个就是闭包了
闭包到底会不会造成内存泄露呢
怎么说呢,这个问题,我觉得有可能会造成内存泄露,只是说有可能,如果在写代码过程中,我们无意识的使用了闭包,这个时候运行环境js引擎优化方面做的好的话会自动帮我们释放,我们无需担心,但有的并不会释放,当项目特别大的时候,电脑配置又不好的时候,就有可能造成内存泄漏了。但现在的js引擎优化都做的挺好,而且es6出来后,感觉一般的业务中场景都不太需要用到闭包,加上学习并正确的使用闭包,感觉没什么问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。