javaScript闭包

1. 闭包出体验

    

  上面代码翻译成自然语言如下:

  (1)定义了一个普通函数A

  (2)在A中定义了普通函数B

  (3)在A中返回B(确切的讲,在A中返回B的引用)

  (4)执行A(),把A的返回结果赋值给变量 c

  (5)执行 c()

  把这5步操作总结成一句扯淡的话就是:函数A的内部函数B被函数A外的一个变量 c 引用 把这句扯淡的话再加工一下就变成了闭包的定义: 当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。

2. 闭包的作用

  先了解一下 javascript中的GC机制:在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收,否则这个对象一直会保存在内存中。

   上述例子中,B定义在A中,因此B依赖于A,而外部变量 c 又引用了B, 所以A间接的被 c 引用,也就是说,A不会被GC回收,会一直保存在内存中。为了证明我们的推理,上面的例子稍作改进。

  

  ount是A中的一个变量,它的值在B中被改变,函数B每执行一次,count的值就在原来的基础上累加1。因此,A中的count一直保存在内存中。这就是闭包的作用,有时候我们需要一个模块中定义这样一个变量:希望这个变量一直保存在内存中但又不会“污染”全局的变量,这个时候,我们就可以用闭包来定义这个模块。

  但是上面的这种写法是比较简单的 但是在大型的js框架中是不会这么写的。

  

  这段代码中似乎看到了闭包的影子,但 f 中没有任何返回值,似乎不具备闭包的条件,注意这句代码:

window.jView = obj;

   obj 是在 f 中定义的一个对象,这个对象中定义了一系列方法, 执行window.jView = obj 就是在 window 全局对象定义了一个变量 jView,并将这个变量指向 obj 对象,即全局变量 jView 引用了 obj . 而 obj 对象中的函数又引用了 f 中的变量 viewport ,因此 f 中的 viewport 不会被GC回收,会一直保存到内存中,所以这种写法满足闭包的条件。

原文地址:https://www.cnblogs.com/syomm/p/5968304.html