闭包的作用及立即执行函数

闭包的作用

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

你可能感兴趣的:(闭包的作用及立即执行函数)