闭包的含义,要解决的问题
闭包的含义就是闭合, 包起来. 简单的来说就是一个具有封闭功能与 包裹功能的一个结构. 所谓的闭包就是,有一个具有封闭的对外不公开的, 包裹结构, 或空间。
在JavaScript中函数可以构成闭包,一般函数是一个代码结构的逼疯结构,也就是包裹的特性,同事根据作用域的规则(只允许函数访问外部的数据,外部无法访问函数内部的数据),即封闭的对外不公开的特性,因此说函数可以构成闭包。
闭包要解决什么问题:访问到函数内部的数据。
类似于如下代码:
function foo () {
var num = 123;
return num;
}
var res = foo();
console.log( res );
这样确实可以访问到函数中的数据,但是不能二次访问,因为第二次访问的时候又要调用一次foo,表示又有一个新的num = 123,然后在函数内的数据,不能直接在函数外被访问,所以在函数内如果定义一个函数的话,那么在这个内部函数中是可以直接访问的:
function foo() {
var num = Math.random();
function func() {
return num;
}
return func;
}
var f = foo();
// f 可以直接访问这个 num
var res1 = f();
var res2 = f();
如何获得超过一个数据:
function foo () {
var num1 = Math.random();
var num2 = Math.random();
return {
num1: function () {
return num1;
},
num2: function () {
return num2;
}
}
}
如何完成读取一个数据和修改这个数据:
function foo () {
var num = Math.random();
return {
get_num: function () {
return num;
},
set_num: function ( value ) {
num = value;
}
}
}
基本的闭包结构:
一般闭包的问题就是要想办法间接的获得函数内部数据的使用权,所以总结出一个基本的使用模型:
1.写一个函数,函数内定义一个新函数,返回新函数,用新函数获得函数内的数据;
2.写一个函数,函数内定义一个对象,对象中绑定多个函数(方法),返回对象,利用对象的方法访问函数内的数据
闭包是为了实现具有私有访问空间的函数;
闭包的基本用法:
1.带有私有访问数据的对象:
function Person() {
this.name = '张三';
// setName( '' )
}
所谓的私有数据, 就是说只有函数内部可以访问的数据, 或对象内部的方法可以访问的数据
1.最简单的实现方式
function createPerson() {
var name = "";
return {
get_Name: function () {
return name;
},
set_Name: function ( value ) {
// 如果不姓张就报错
if ( value.charAt( 0 ) === '张' ) {
name = value;
} else {
throw new Error( '姓氏不对, 不能取名' );
}
}
};
}
- 带有私有数据的函数:
var func = function () {}
function func () {}
var foo = (function () {
// 私有数据
return function () {
// 可以使用私有的数据
};
})();
闭包的性能问题?
函数执行需要内存, 那么函数中定义的变量, 会在函数执行结束后自动回收. 凡是因为闭包结构, 被引出的数据.
如果还有变量引用这些数据的话, 那么这些数据就不会被回收.
因此在使用闭包的时候如果不使用某些数据了, 一定要赋值一个 null
var f = (function () {
var num = 123;
return function () {
return num;
};
})();
// f 引用着函数, 函数引用变量 num,因此在不使用该数据的时候, 最好写上 f = null;
浙公网安备 33010602011771号