闭包与立即执行函数理解与区别

什么是闭包

内部函数被外部函数以外的变量引用时,就形成了一个闭包

function outter() {
	var num = 0;
	return function inner() {
		console.log(++num);
	}
}

var a = outter()
a()//内部函数inner被外部函数outter以外的变量a引用

作用

闭包是函数内部和外部联系起来的桥梁。这样函数外部就可以读取函数内部的变量,让这些变量的值一直保存在内存中。

理解

由于js的垃圾回收机制,函数执行之后就会立即销毁,然而闭包中,外部函数的变量被内部引用,内部又被函数外部的变量引用,这样当a执行之后,outter函数还是会被销毁,但是内部函数在执行时会创造一个容器来存放上层引用关系,所以num会一直存在在内存中,下次调用a,num还是会保存上次执行之后的状态。如果新建一个变量b,引用outter方法,就会开辟一块新的地址,b执行时num还是初始化的状态,a b两块地址互不影响。
一句话总结:闭包找到的是同一地址中父级函数中对应变量最终的值(其他博主说的,很有道理。)
原文链接:https://blog.csdn.net/weixin_43586120/article/details/89456183

注意内存泄漏。

但凡是当前活动对象中有被内部子集引用的数据,那么这个时候,这个数据不删除,保留一根指针给内部活动对象。

每次外部函数执行的时 候,外部函数的引用地址不同,都会重新创建一个新的地址。

代码理解引自https://blog.csdn.net/weixin_43586120/article/details/89456183?ops_request_misc=&request_id=&biz_id=102&utm_source=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0

立即执行函数

和闭包没什么关系却总放在一起使用。

函数声明
规则:必须指定一个函数名字

foo();
function foo() {
    console.log("函数声明")
}
//由于函数声明会被提升,所以调用函数可以在之前或之后调用

函数表达式
规则:将函数赋值给一个变量

 var foo = function () {
     console.log("函数表达式")
 }
 foo()
//由于函数表达式,只会对变量foo进行提升,只有运行到代码处,才会对变量foo进行赋值,所以调用函数必须在函数表达式之后

立即执行函数
常用的两种方式

 (function () {
     console.log("立即执行函数")
 })();

 (function () {
     console.log("立即执行函数")
 }())

立即执行函数的演变
1:在函数表达式后加括号,可以立即执行函数

 var foo = function () {
       console.log("立即执行函数")
   }();

2:在匿名函数后加括号,不可以立即执行函数

 function () {
      console.log("立即执行函数")
  }();

在函数表达式后加括号可以立即执行函数,但如果不把匿名函数赋值给变量,而直接在后边加一个括号,则会报语法错误。因为当JS引擎在遇到function时,会默认把它当作是函数声明,所以必须要有一个函数名

3:在函数声明后加括号,不可以立即执行函数

function foo() {
         console.log("立即执行函数")
     }()

如果给匿名函数添加一个函数名,也就变成了函数声明,然后在函数声明后加括号,也会报语法错误,因为函数声明会被提升,当提升后就相当于在代码中只写了一对括号,而这个括号和前面的函数声明又没什么关系,所以语法报错

原文链接:https://blog.csdn.net/Liu_yunzhao/article/details/90641956

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页