首页 > 代码库 > 闭包 —JavaScript面向对象高级
闭包 —JavaScript面向对象高级
# 闭包 #
我的理解:面试时,先说作用域链,再说闭包产生的原因,然后是垃圾回收GC,最后说闭包。
a.一个函数内部声明的变量,就是它的私有变量.
b.在javascript中特性中,函数是可以访问它所在作用域链的所有变量.
c.但函数外部是不能直接访问函数内部的私有变量
D.通过函数内部再嵌套函数,子函数返回父函数的变量,就创建了一个闭包。
闭包的表现形式
模块化的本质:是通过函数的局部作用域特性来产生局部上下文来保存局部变量
1.函数作为返回值
function fn(){
var count = 0;
return function(){ //这句话是重点
count++;
console.log(count)
}
}
var a = fn()
a(); //1
a(); //2
a(); //3
a(); //4 //a作为变量,是对fn()的引用,所以fn一直没被释放
a = fn() //对a重新赋值,重新把fn的引用给a 所以中间释放过
a(); //1
2.函数当做参数传递
var max = 10;
var fn =function(x){
if(x>max){
console.log(x)
}
}//max是自由变量,在fn定义好后就固定,所以max =10
function fn1(f){
var max = 100;
f(15);
}
fn1(fn) //15
3.信息暴露和隐藏
function fn(){
var a = 10;
var b = [1,2,3,4];
var count = 0;
function addCount(){
count++
};
function getCount(){
return count;
}
return {
add:addCount,
get:getCount
}
//这里暴露出去的对象,只有两个方法,而私有变量a 和 b没有暴露,所以是保密的,可以选择性的暴露 ————模块化 seajs就是这样实现
}
var a = fn(); //将引用给a
4.异步回调
// 闭包——异步回调
function fn(){
var i = 0;
window.setInterval(function(){
console.log(i++)
},1000);
console.log(‘prevent‘)
}
fn()
注意:setInterval()是典型的异步,fn在执行后,打印出‘prevent‘,然后应该fn调用完成被销毁,但是定时器依然在执行,所以fn依然还在。
闭包 —JavaScript面向对象高级