什么是闭包?

闭包是javascript的一大难点,也是它的特色,很多高级应用都要依靠闭包来实现。

1.变量作用域

要理解闭包,首先要理解javascript的特殊的变量作用域

变量的作用域无非就两种:全局变量和局部变量

javascript语言的特别之处就在于:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量

注意点:在函数内部声明变量的时候,一定要使用var命令

2.如何从外部读取函数内部的的局部变量?

那就是在函数内部在声明一个函数

                                                           

function f1(){

    var n=999;

    function f2(){
      alert(n); // 999
    }

  }

                                                            

在上面的代码中,函数f2就包括在函数f1内部,这是f1内部的所有局部变量,对f2都是可见的,但是反过来不行,f2内部的局部变量,对f1就是不可见的。

这就是javascript语言特有的 "链式作用域" 结构,

子对象会一级一级地向上寻找父对象的变量,所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!

3.闭包的概念

上面代码的f2函数,就是闭包

闭包就是能够读取其他函数内部变量的函数

由于在javascript中,只有函数内部的子函数才能读取局部变量,所以说,闭包可以理解成 "定义一个函数内部的函数"

猜你喜欢

转载自blog.csdn.net/leeningfeng/article/details/81078821