什么是闭包(closure),为什么要用它?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是闭包(closure),为什么要用它?相关的知识,希望对你有一定的参考价值。

参考技术A 闭包指的是一个函数可以访问另一个函数作用域中变量。常见的构造方法,是在一个函数内部定义另外一个函数。内部函数可以引用外层的变量;外层变量不会被垃圾回收机制回收。

注意,闭包的原理是作用域链,所以闭包访问的上级作用域中的变量是个对象,其值为其运算结束后的最后一个值。

优点:避免全局变量污染。缺点:容易造成内存泄漏(变量都被保存在内存中)。

闭包的使用场景:封装组件,函数引用类型,定义私有数据

特性:

a. javascript允许你使用在当前函数以外定义的变量

b. 即使外部函数已经返回,当前函数仍然可以引用在外部函数所定义的变量

c. 闭包可以更新外部变量的值

d. 用闭包模拟私有方法

由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题

例子:

什么是闭包(closure),为什么要用它?在开发项目时什么地方用闭包?以及优点和缺点

一.什么是闭包?
我看看了很多的解释,看的人云里雾里的。最后总结了一下,闭包其实就代码编写时呈现的一种特定形式,就是在一个函数中定义并返回了另外一个函数,在这个内部定义的函数中可以访问外面的函数定义的变量,但是外面函数不能访问内部函数定义的变量。

function test1(){
var a = "abc";
var b = "efg";
var test2 = function(a1,b1){
console.log("a1:"+a1+"--b1:"+b1);
}
return test2(a,b);
}

闭包其实和js的作用域是紧紧相关联的,要想了解闭包还必须首先了解一下js的作用域。
这里我们先不考虑ES6,我们只考虑ES5及以下。

作用域?
作用域其实就是变量或或属性能够起作用的范围,就像我们常说的领空一样,我们国家的战斗机一般只能在我们自己的领空进行巡逻,训练啥的,你如果跑到其他国家的领空去了你这就叫入侵了,这是要出事情的,轻者就像我们外交部常说那样“我们抗议,我们严重抗议,我们坚决反对”然后没了;重者就像土耳其直接将俄罗是的战机干下来一样。当然美帝是一个Bug,不考虑。言归正传,js的作用域分为局部作用域和全局作用域。
局部作用域又叫函数作用域,他只在函数内部生效,定义在该作用域内的变量或属性,就只能在该函数内可以访问。其他的函数想访问,对不起,此领空不开放。

var age="10";
function person(){
var name = "wang_yangyang";
}

上面代码中person函数在执行的时候就形成了一个局部作用域,在该作用域中name就是局部变量只有在person中才能访问到,你在person外面是访问不到的。另外就是全局作用域了,顾名思义就是在哪里都可以访问的,由一种普天之下莫非王土的赶脚。
类似上面代码中age说在的作用域就是全局作用域,你在所有全局作用域定义的函数中都可以访问


原作者链接:https://blog.csdn.net/wang839305939/java/article/details/73065099

以上是关于什么是闭包(closure),为什么要用它?的主要内容,如果未能解决你的问题,请参考以下文章

什么是闭包(closure),为什么要用它?在开发项目时什么地方用闭包?以及优点和缺点

前端面试题js和jQuery

我所理解的JavaScript闭包

什么是外函数,什么是内函数?闭包(Closure)是什么?说说你对闭包(Closure)的理解?

JavaScript 学习-24.函数闭包(closure)

Swift语言精要-闭包(Closure)