第3章闭包和高阶函数

第3章闭包和高阶函数

3.1闭包

3.1.1 变量的作用域

3.1.2 变量的生存周期

var Type = {};
for(var i = 0, type; type = ['String','Array','Number'][i++];){
    (function(type){
        Type['is'+type] = function(obj){
            return Object.prototype.toString.call(obj) === '[object '+type+']';
        }
    })(type)
}
var a = Type.isArray([]);//true
var b = Type.isString('str');//true
console.log(a);
console.log(b);

3.1.3 闭包的更多作用

1封装变量

var mult = (function(){
    var cache = {};
    var calculate = function(){
        for(var i = 0, l = arguments.length; i<1; i++){
            a = a*arguments[i];
        }
        return a;
    };
    return function(){
        var args = Array.pototype.join.call(arguments,',');
        if(args in cache){
            return cache[args];
        }
        return cache[args] = calculate.apply(null,arguments);
    }
})()

2延续局部变量的寿命

3.1.4 闭包和面向对象设计

var extent = function(){
    var value = 0;
    return {
        call : function(){
            value++;
            console.log(value);
        }
    }
}

var extent = extent();
extent.call();
extent.call();
extent.call();

//面向对象的写法

var extent = {
    value:0,
    call:function(){
        this.value++;
        console.log(this.value);
    }
}
extent.call();//1
extent.call();//2
extent.call();//3


//或者
var Exent = function(){
    this.value = 0;
}
Exent.prototype.call = function(){
    this.value+;
    console.log(this.value);
}
var extent = new Exent;
extent.call();//1
extent.call();//2
extent.call();//3

3.1.5用闭包实现命令模式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<button id="execute">点击我执行命令</button>
<button id="undo">点击我执行命令</button>
    <script>
        var Tv = {
            open:function(){
                console.log("打开电视");
            },
            close:function(){
                console.log("关上电视")
            }
        };
        var OpenTvCommand = function(receiver){
            this.receiver = receiver;
        }
        OpenTvCommand.prototype.execute = function(){
            this.receiver.open();
        }
        OpenTvCommand.prototype.undo = function(receiver){
            this.receiver.close();
        }
        var setCommand = function(command){
            document.getElementById('execute').onclick = function(){
                command.execute();
            }
            document.getElementById('undo').onclick = function(){
                command.undo();
            }
        };
        setCommand(new OpenTvCommand(Tv));
        //把请求封装为对象,从而分离请求的发起者和请求的接收者(执行者)之间的耦合关系

    </script>
</body>
</html>

闭包版本

var Tv = {
    open:function(){
        console.log('打开电视');
    },
    close:function(){
        console.log('关上电视');
    }
};

var createCommand = function(receiver){
    var execute = function(){
        return receiver.open();
    }
    var undo = function(){
        return receiver.close();
    }
    return {
        execute:execute,
        undo:undo
    }
};

var setCommand = function(command){
    document.getElementById('execute').onclick = function(){
        command.execute();
    }
    document.getElementById('undo').onclick = function(){
        command.undo();
    }
};
setCommand(createCommand(Tv));

3.1.3 闭包与内存管理

C++以COM对象的方式实现BOM和DOM COM对象的垃圾收集机制采用的是以引用计数策略

把循环引用中的变量设为null

3.2 高阶函数

3.2.1函数作为参数传递

1回调函数

var appendDiv = function(){
    for(var i = 0; i<100; i++){
        var div = document.createElement('div');
        div.innerHTML = i;
        document.body.appendChild(div);
        if(typeof callback === 'function'){
            callback(div);
        }
    }
}
appendDiv(function(){
    node.style.display = 'none'
});

2Array.prototype.sort

[1,4,3].sort(function(a,b){
    return a-b;
})   //[1,3,4]

[1,4,3].sort(function(a,b){
    return b-a;
}) //[4,3,1]

3.2.2函数作为返回值输出

1判断数据的类型

var isType = function(type) {
    return function(obj){
        return Object.prototype.toString.call(obj) ==='[object ' + type+']';
    }
}
var isString = isType('Sting');
var isArray = isType('Array');
var isNumber = isType('Number');
console.log(isArray([1,2,3])); //true 

2getSingle

var getSingle = function(fn){
    var ret;
    return function(){
        return ret || (ret = fn.apply(this,arguments))
    }
}

var getSingle = getSingle(function(){
    return document.createElement('script');
})

var script1 = getSingle();
var script2 = getSingle();
console.log(script1===script2); 

3.2.3高阶函数实现AOP

Function.prototype.before = function(beforefn){
    var _self = this;
    return function(){
        beforefn.apply(this,arguments);
        return _self.apply(this,arguments);
    }
}

Function.prototype.after = function(afterfn){
    var _self = this;
    return function(){
        var ret = _self.apply(this,arguments);
        afterfn.apply(this,arguments);
        return ret;
    }
};

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

推荐阅读更多精彩内容