关于闭包的终极解释

在学校里总有一些初学JS的新同学再询问闭包是什么?那么接下来将以我的理解讲述一下闭包

要说闭包首先要讲一个名词 自由变量 

什么叫做自由变量 看下列代码

var a = 100
function fn() {
    var b = 200
    console.log(a) //a没有在函数作用域内找到 便向上父级作用域查找 因此也称a为自由变量
    console.log(b)
}

以上a便是自由变量 --------当前作用域没有定义的变量 那么与闭包有什么关系呢

经过笔者大量查询参考 关于闭包理解觉得最通透的一句话为 内部函数引用内部变量并被外部所引用成为闭包 看以下例子

var a=200;
function F1() {
var a = 100 return function () {
     a++ ;   console.log(a)
//内部函数引用内部变量 } } var f1 = F1() //被外部所引用 f1() //101
f1() //102

 为什么是101 102 而不是201 202?

因为自由变量将从作用域链中去寻找,但是 依据的是函数定义时的作用域链,而不是函数执行时

而闭包也油然而生,执行f1 我们将在定义时的F1中寻找到自由变量a 而不是在全局作用域的a 而且也保持了F1中的a在内存中没有被销毁 再执行f1的时候再次找到其并再增1;

这便是我所理解的闭包。

 

 

posted @ 2018-04-02 20:35  于总97  阅读(314)  评论(0)    收藏  举报