闭包的作用
1.实现共有变量
eg:函数累加器
function add() {
var count = 0;
function demo (){
count++;
console.log(count);
}
return demo;
}
var counter = add();
counter();1
counter();2
counter();3
counter();4
2.可以做缓存结构(存储结构)
eg:eater
function eater() {
var food = "";
var obj = {
eat : function () {
console.log(" i am eating " + food);
food = "";
}
push : function (myfood){
food = my Food;
}
}
return obj;
}
var eater1 = eater();
eater1.push('banana');
eater1.eat();
3.可以实现封装,属性私有化。
eg:Person();
function Person(name){
//var this = {
//makeMoney : function() {}
//offer : function() {}
//}
var money = 100;
this.name = name;
this.makeMoney = function(){
money ++;
}
this.offer = function(){
money --;
}
//return this;
}
var person = new Person();
只有Person里面AO两个方法可以访问到属性
money,money在方法里面的作用链里,person
是访问不到的,这就是私有化属性。
4.模块化开发,防止污染全局变量
- 立即执行函数:此类函数没有函数声明,在执行过后即释放。适合做初始化工作。
(function () {
var a = 123;
var b = 234;
console.log(a+b);
}( ) )
如果函数执行完 给函数加个函数名 会报错
除了执行完立即释放 和其他函数没有什么区别
立即执行函数
针对初始化功能的函数
(function () {} () ) ;w3c建议第一种
(function () {} )();
只有表达式才能被执行符号执行,被执行符号执行
的表达式放弃了函数的名称,也就成了立即执行函
数,而且只能执行一次。
var test = function () {
console.log('a');
}();
console.log(test)=>underfined 放弃了函数名称所
以是underfined 等号前面的是变量声明 后面的是
变量赋值 也就是函数表达式
+/-/! function test () {
console.log('a');
}();这里是函数表达式 所以可以直接被执行符号执
行
function test () {
var arr = [];
for(var i = 0; i < 10; i ++){
arr[ i ] = function () {
document.write( i + " ");
}特别注意arr[i]是执行语句,后面的i是函数
里的i,是定义语句.前面的i取0~9时,后面的i不能
一起变,只有后面的语句执行时,它才会去找前面
的i是什么.
}
return arr;
}
var myArr = test ();
for ( var j = 0; j < 10; j++){
myArr[ j ]( );
}
打印结果10个10
function test () {
var arr = [];
for(var i = 0; i < 10; i ++){
(function (j) {
arr[ j ] = function () {
document.write( j + " ");
}
}(i));
}
return arr;
}
var myArr = test ();
for ( var j = 0; j < 10; j++){
myArr[ j ]( );
}
打印结果是0~9
- eg:写一个方法求一个字符串的字节长度。字符串有一个方法charCodeAt();一个中文占两个字节,一个英文占一个字节。
function retByteslen(target) {
var count = 0;
for( var i = 0 ; i 255) {
count +=2
}
}
console.log(count);
}或者下种方法
function retByteslen(target) {
var count = target.length;
for( var i = 0 ; i 255) {
count ++;
}
}
console.log(count);
}
var x = 1;
if(function f () {}) {
x += typeof f;
}
console.log(x); =>1underfined
if括号里无论放的什么条件,都得将里面的东西变
成表达式,所以再也不是函数定义了,f 从此就消
失了。 tpyeof 后面接一个从未声明的变量 返回字
符串类型的underfined