js 老生常谈的(闭包)
前言
你可以在一个函数里面嵌套另外一个函数。嵌套(内部)函数对其容器(外部)函数是私有的。它自身也形成了一个闭包。一个闭包是一个可以自己拥有独立的环境与变量的的表达式(通常是函数,因为ES6有了块级作用域的概念)。
初识闭包:

什么是闭包?闭包有什么作用?这是我遇到闭包时的第一反应。
闭包在JavaScript高级程序设计(第3版)中是这样描述:闭包是指有权访问另一个函数作用域中的变量的函数,那么闭包的作用也就很明显了。
1. 可以在函数的外部访问到函数内部的局部变量。
2. 让这些变量始终保存在内存中,不会随着函数的结束而自动销毁。
在上面的代码中,闭包指的就是function () {return counter += 1;}这个函数。首先解释一下这段代码,在变量add被赋值之前,
第一个function执行了一次(执行且仅会执行一次),因为这是一个函数表达式声明方式并且声明后加上了(),所以会自动执行一次。
执行后add被赋值(匿名函数)了,add= function () {return counter += 1;} 。然后每次调用add()函数时,返回的都是这个函数,
因为这个函数在第一个函数的内部,所以即使第一个函数执行完了,第二个函数依然能访问counter(JS设计的作用域链,当前作用域能访问上级的作用域)。
闭包是可以在另一个函数的外部访问到其作用域中的变量的函数。而被访问的变量可以和函数一同存在。即使另一个函数已经运行结束,导致创建变量的环境销毁,
也依然会存在,直到访问变量的那个函数被销毁。当然,如果仅仅是做一个简单的计数器,大可不用这样麻烦。下面这简短的代码就能轻松实现
var a = 0;
function myFunction(){
a++;
document.getElementById("demo").innerHTML = a;
}
js闭包 (私有化)
var init=(function(){
var a=100;
function w(){
console.log(a+=1)
};
function e(){
console.log(a+=1)
};
return function(){
w(); //101
e(); //102
}
}());
init();
模块化闭包
var myObji=(function(){
var models={};
function define(name,deps,impl){
for(var i=0;i<deps.length;i++){
deps[i]=models[deps[i]]
}
models[name]=impl.apply(impl,deps)
}
function get(name){
return models[name]
}
return{
define:define,
get:get
}
})()
myObji.define("bar",[],function(){
function hello(who){
return "我是"+who;
}
return {
hello:hello
}
})
var bar=myObji.get("bar")
bar.hello("haha") //我是haha
上面代码看不懂 看下面
var modules=(function(){
var obj={};
function def(name,fun){
obj[name]=fun()
}
//查询{}里面的属性
function get(name){
return obj[name]
}
return{
def:def,
get:get
}
}())
modules.def("z",function(){
function hello(){
return "哈哈我是闭包"
}
return {
hello:hello
}
})
var f=modules.get("z");
f.hello()

浙公网安备 33010602011771号