说起闭包,让很多新手头疼的一个概念,甚至于有一两年js基础的开发人员也没有搞懂
说到闭包,要从js的作用域说起,js的变量是函数作用域,且变量不能被函数外部访问,但是可以被函数内部的函数访问.这称为js链式作用域
1什么是闭包???(我的理解是,闭包就是能够读取其他函数内部变量的函数)
function t1(){ var age = 20; function t2(){ alert(age); }; return t2; }; var tnp = t1(); /* 1、在大部分的语言中,t1被调用执行,申请内存,并把局部变量push入栈, t1函数执行完毕后,内部的局部变量随着函数的退出而销毁,因此age = 20的局部变量也就释放了。 2、但是在js中,t1执行过程中,又生成了t2,而从作用于上来说t2可以访 问到age = 20,于是age = 20并没有消失,而是与返回的t1函数形成了一个环境包,这个包属于t2,也即是闭包。 一句话概括就是:函数的作用域取决于声明时而不是取决于调用时 */ var age = 100; tnp();//20
2函数的作用域取决于声明时而不是取决于调用时
function closure(){ var sister = '大桃花'; var me = function(){ alert(sister); }; return me; }; function place(){ var sister = '大福晋'; var girl = closure(); girl(); }; place();//大桃花
3闭包的作用(防止全局污染,它使得函数拥有私有变量变成可能,使得让这些变量的值始终保持在内存中)
计数器受匿名函数的作用域保护,只能通过 add 方法修改
var add = (function () { var counter = 0; return function () {return counter += 1;} })();
4用闭包来完成私有属性
// 用闭包让bf不能外界访问 function Girl(name,bf){ var secret = bf; this.name = name; // 通过showlove做借口来读取私有属性secret this.showlove = function(){ return secret; }; // 外界是操作不了变化的 this.movelove = function(){ secret = '薛宝钗'; }; }; var daiyu = new Girl('林黛玉','贾宝玉'); alert(daiyu.name+'喜欢'+daiyu.bf);//林黛玉喜欢undefined daiyu.movelove(); alert(daiyu.name+'喜欢'+daiyu.showlove());//林黛玉喜欢薛宝钗
/* 这是通过闭包来完成js面向对象的私有属性与封装 这方法是js大牛道格拉斯提出的 */