闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。 很显然,几乎了解不了闭包的意思(这里对百度没有任何不好的言论导向),也不知道闭包的有关信息。所以我们从闭包的生成原因来探究 什么是闭包? 1.闭包的形成 首先我们来看其他互联网平台对闭包的解释 闭包:指有权访问另一个函数作用域中变量的函数。 什么是作用域? 当我们声明一个函数的时候,会自动生成一个它的作用域。
例如声明了一个函数fun1() 。我们之前讲过一个概念叫做对象,那么这个fun1()它就是个对象,既然是对象那就有他的属性,在JavaScript引擎中会自动生成一个属性[[scope]],这个玩意叫做作用域,是个隐式属性我们无法去直接调用它,是JavaScript引擎去存取的。
function fun1(){ var a = 10; console.log(a); }
在作用域里面有一个作用域链 scope chain,它是所有执行期上下文对象的集合,呈链式链接; 例如该函数就会生成一个我们看不见的作用域,里面就存取了一个作用域链(scope chain),它的第0位指向Global Object,是全局的一个执行上下文,它存储着一些基本信息,其中就有一个fun1,值为funuction; 然后我们执行这个函数
fun1();
这个时候系统就会去找fun1的作用域,然后再去找它的作用域链,首先是第0位,是GO(Global Object),在这里之前有个预编译环节,我们先不讲,实际这个时候不是GO。然后我们声明了一个变量a,它也有一个执行期上下文,这里它叫做AO;然后这个AO它就到了第零位(是被该位置的指针指向AO的),而GO在第一位;很显然 这是个 栈 结构,那我们就明白了这个函数的背后逻辑。 也就是说闭包 当内部函数访问外部函数的变量的时候就会产生闭包。