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

闭包的作用

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<target.length; i++){
     if(target.charCodeAt(i) <= 255)  {
        count ++;
    }else  if(target.charCodeAt(i) > 255) {
       count +=2
     }
  }
   console.log(count);
}或者下种方法
function retByteslen(target) {
  var count = target.length;
  for( var i = 0 ; i<target.length; i++){
     if(target.charCodeAt(i) > 255)  {
        count ++;
    } 
  }
   console.log(count);
}
 var  x = 1;
 if(function f () {}) {
 x += typeof f;
}
console.log(x);  =>1underfined
if括号里无论放的什么条件,都得将里面的东西变
成表达式,所以再也不是函数定义了,f 从此就消
失了。  tpyeof 后面接一个从未声明的变量  返回字
符串类型的underfined
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,699评论 0 13
  • 一、框架 1、Mac系统及常用工具、进制;C数据类型、常量变量、运算符、表达式、格式化输入输出 2、关系运算符、逻...
    师景福阅读 4,059评论 0 2
  • 一切都是最好的安排, 生活总会给你答案的! 当你身处逆境,感到诸事不顺,爱情、工作、事业、理想都成泡影,心生绝望之...
    KOALA_e36d阅读 3,021评论 0 2
  • 王某某 2016年9月 官方文档 Apache Hadoop 2.7.2 文档 http://hadoop.apa...
    王某某的笔记阅读 4,935评论 0 2
  • 有时候晚上睡不着,登上QQ,上下翻看,一遍又一遍。那些常久显示灰暗色调的小企鹅,你有多想念其背后的主人? 是的,非...
    夜微语z阅读 4,216评论 4 5