2017/03/13
前言
closure
(闭包)是Javascript
这门动态语言很难的部分,但在项目中实用性很强,并且在高阶函数中运用很多。
闭包
我总结的闭包特性:
闭包是函数
函数可嵌套,闭包一定是一个作用域内的一个函数
闭包能保持住外部作用域的变量不被销毁
涉及的概念:函数作用域
、内存回收
,请自行查阅书籍。不多说,直接上例子。
例1
var a = 10;
function fn(){
console.log(a);
}
fn();
// 最简单的例子
// 全局环境定义变量 a
// 闭包 fn 为全局作用域内的一个函数,函数内部保持着外部变量 a 不被内存回收
例2
function foo(){
var a = 1;
return function(){
console.log(a++);
}
}
var fn = foo();
fn();
// 函数 foo 作用域内有变量 a 和一个匿名函数,也就是这段程序中的闭包
// 程序第 7 行, 变量 fn 为闭包的引用
// 反复执行 fn ,则会在控制台看到从 1 开始不停的累加,闭包让外部的变量 a 不被销毁
例3
我们来看一段闭包在项目中的应用,即单例模式
// 单例模式
var getSingle = function(fn){
var ret;
return function(){
return ret || (ret = fn.apply(this, arguments));
}
};
// 页面只需要一个 div 来呈现弹出框
var getDialog = getSingle(function(){
return document.createElement('div');
});
var obj1 = getDialog();
var obj2 = getDialog();
console.log(obj1 === obj2); // true
// 不管 getDialog 在这段程序之后执行多少次,赋值给多少其他变量,这些变量全部都是同一个 div 对象
更多
更多关于闭包的理解,请点击下载国外友人的PPT
网友评论