JavaSript高级程序设计-第七章学习笔记

7.1 递归

  • arguments.callee是一个指向正在执行的函数的指针,可以实现函数的递归调用
function factorial(num){
         if(num <= 1){
                   return 1;
} else {
         return num * arguments.callee(num - 1);
}
}
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4)); // output 24
  • 在编写递归函数时,使用aguments.callee总比使用函数名更保险;

7.2闭包

公众号前端大全-详解 JavaScript 闭包

闭包的特性

  • 闭包有三个特性:
  1. 函数嵌套函数;
  2. 函数内部可以引用外部的参数和变量(即函数内部定义是函数会将包含函数即外部函数的活动对象添加到它的作用域链中);
  3. 参数和变量不会被垃圾回收机制回收;

闭包的定义及其优缺点

  1. 闭包 是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量;
  2. 闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露
  3. 闭包是javascript语言的一大特点,主要应用闭包场合主要是为了:设计私有的方法和变量。
  4. 一般函数执行完毕后,局部活动对象就被销毁,内存中仅仅保存全局作用域。但闭包的情况不同;

嵌套函数的闭包

function aa(){
    var a=1;
    return function(){
       alert(a++);
    };
}
var fun = aaa();  
    fun();// 1 执行后 a++,,然后a还在~  
    fun();// 2  
    fun = null;//a被回收!

闭包会使变量始终保存在内存中,如果不当使用会增大内存消耗。

javascript的垃圾回收原理

  1. 、在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收;
  2. 如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。

使用闭包的好处

  1. 希望一个变量长期驻扎在内存中
  2. 避免全局变量的污染
  3. 创建用于访问私有变量的公有方法

====全局变量的累加====

var a = 1;
function abc(){
    a++;
    alert(a);
}
abc();              //2
abc();            //3

==局部变量==

function abc(){
        var a = 1;
        a++;
        alert(a);
}
abc();                       //2
abc();                    //2

那么怎么才能做到变量a既是局部变量又可以累加呢?

局部变量的累加

function outer(){
        var x=10;
        return function(){  //函数嵌套函数
            x++;
            alert(x);
        }
}
var y = outer();              //外部函数赋给变量y;
y();                 //y函数调用一次,结果为11,相当于outer()();
y();                //y函数调用第二次,结果为12,实现了累加

模块化代码,减少全局变量的污染

function aa(cout){
    for(var i=0;i<count;i++){
        alert(i);
    }
    alert(i);
}

如上,定义了一个for循环,在有块级作用域的语言中,循环一旦结束,i就会销毁,但在js,变量i、是定义在aa()的活动对象中,在函数内部随处访问到它;

function aa(count){
    (function(){
    //这里是块级作用域
        for(var i=0;i<count;i++){
        alert(i);
        }
    })();
    alert(i);//导致错误
}

如上,我们在for循环外部插入一个私有作用域,在匿名函数中定义的任何变量,都会在执行结束后被销毁;

通过创建私有作用域,每个开发人员既可以使用自己的变量又不必担心搞乱全局作用域;
如:

(function(){
    var now=new Date();
    if(now.getMonth()==0&&now.getDate()==1){
        alert("Happy new year");
    }
    
})();

私有变量:

任何在函数中定义的变量,都可以认为是私有变量。因为在函数外部不能访问这些变量。
把有权访问私有变量和私有函数的公有方法叫特权方法。

function MyObject(){
         //私有变量
         var privateVariable = 10;
         function privateFunction(){
                   return false;
         }
         //特权方法
         this.publicMethod = function(){
                   privateVariable ++;
                   return privateFunction();
         }
}

静态私有变量

(function(){
         var privateVariable = 10;
         function privateFunction(){
                   
         }
         Myobject = function(){               
         }
//公有/特权方法
         Myobject.prototype.publicMethod = function(){
                   privateVariable ++;
                   return privateFunction();
         }
})()

这个模式创建了一个私有作用域,并在其中封装了一个构造函数及相应的方法。

this对象:this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环境具有全局性,因此对象通常指向window.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 1. js介绍 js是为了实现网络交互而是设计的脚本语言,有以下三部分组成 ECMAScript,由ECMA-26...
    Zoemings阅读 537评论 0 1
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,145评论 0 13
  • 定义函数的方式有两种:函数声明和函数表达式。 函数声明的一个重要特征就是函数声明提升,意思是在执行代码前会先读取函...
    oWSQo阅读 663评论 0 0
  • MJRefresh使用简介 主要功能:下拉刷新、上拉加载更多,文末有github及demo地址。 ========...
    PZcoder阅读 1,122评论 0 0
  • 每天迎着太阳起早,放点好听的音乐,伴早饭看着远景,一切都这么美好而自然。 今天是出门拜访客户的日子,车...
    幽兰依依阅读 127评论 0 1