闭包本质上是函数访问了此函数的父级及父级以上的作用域变量,那么这个函数就是一个闭包。
所以最简单的,下面的代码就是一个闭包
var a = 1;
(function test (){
alert(a);
})()
上述代码中利用匿名函数使得函数立即执行,函数中调用了函数外的全局变量a,所以是一个闭包。
利用js垃圾回收的特点,使得闭包可以在函数外部访问函数内部的变量。
下面一段代码来自facebook的marketplace创建商品时上传图片生成uoload_id的逻辑
__d(PhotosUploadID, [], (function(a, b, c, d, e, f) {
var g = 1024;
function a() {
return (g++).toString()
}
f.getNewID = a
}
), 66);
// some code
// ...
a.uploadID = d(PhotosUp1oadID).getNewID()
上述代码就是一段常见的典型的闭包。使用requirejs定义模块,初始化变量g,从1024开始取值,而后每次调用getNewID都会在g当前值的基础上+1。利用了js闭包中的变量和参数不会被垃圾回收的机制,实现了一个函数计数器。在当前页面每上传一张图片,upload都会+1,而刷新页面后则会重置为1024.
