JavaScript 闭包
2016-03-27 11:28
549 查看
一、 最简单的闭包
function A() { function B() { console.log("This is B"); } return B; } var c = A();
二、闭包的作用
涉及到Javascript中的GC机制:javascript中,如果一个对象不再被引用,这个对象会被GC回收,否则这个对象一直保存在内存中。证明如下:
var closure = function() { var count = 0; var get = function() { count ++; return count; } return get; }; var c = closure(); console.log(c()); console.log(c()); console.log(c());
执行结果为:
count 是 closure() 中的变量,它的值在 get() 中被改变,函数 get() 每执行一次,count 加1,因此,closure() 中的count 一直保存在内存中。也即全局变量 c 一直引用closure的内部变量count。
这就是闭包的作用:有时候我们希望一个模块中的变量一直保存在内存中,但又不会“污染”全局的变量,此时可用闭包来定义这个模块。
三、高端写法
var f = function(document) { var viewport; var obj = { init: function(id) { viewport = document.querySelector("#" + id); }, addChild: function(child) { viewport.appendChild(child); }, removeChild: function(child) { viewport.removeChild(child); } } window.jView = obj; // 主要为这句代码 }; f(document);
执行 window.jView = obj 就是在window全局对象定义了一个变量 jView,并将这个变量指向obj对象,而 obj 对象中的函数又引用了 f() 函数中的变量 viewport,即全局变量 jView 一直引用 f 内的 viewport 变量,因此 viewport 变量不会被GC回收。满足闭包的条件。
相关文章推荐
- ExtJs学习基础知识
- JSP编译成Servlet(五)JDT Compiler编译器
- JSP编译成Servlet(五)JDT Compiler编译器
- js中的null和undefined
- JavaScript 惰性载入函数
- JavaScript中this详解
- JavaScript异步编程
- ExtJs之Ext.ElementLoader.load
- JavaScript闭包
- 面向对象在javascript中的实践之大杂烩
- JavaScript之基础-7 JavaScript 循环结构 (while、do-while、for及循环中的continue、break)
- 详解javascript跨浏览器事件处理程序
- BZOJ 1823 JSOI 2010 满汉全席 2-SAT
- js事件处理程序跨浏览器解决方案
- JavaScript - 返回头部
- JS快速获取图片宽高的方法
- BZOJ_P1452 [JSOI2009]Count(二维树状数组)
- 基于javascript实现九九乘法表
- 由SOAP说开去 - - 谈谈WebServices、RMI、RPC、SOA、REST、XML、JSON
- (PHP+HTML+JavaScript+Css)一个简单爬虫的开发