码迷,mamicode.com
首页 > 编程语言 > 详细

《javascript设计模式与开发实践》读书笔记(一)

时间:2015-08-27 21:05:33      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

一.高阶函数

1.函数作为参数传递

最经典的例子就是毁掉函数

var fs  = require(‘fs‘);
fs.readFile(‘test.txt‘,function(data,err){
    console.log(data);
});

2.函数作为返回值

作为返回值时候,要注意此时的this指向。

3.函数柯里化

函数柯里化指首先接受一些参数,接受到的参数后不立即执行,而是返回一个新函数,刚才传入的参数在函数形成的闭包中被保存起来,待到真正求值的时候刚才保存的参数才会真正的求值。

var cost = (function(){
    var args = [];
    return function(){
        if(arguments.length===0){
            var money =0;
            for(var i-0;i<args.length;i++){
                money+=args[i];
            }
            return money;
        }else{
            [].push.apply(args,arguments);
        }

    }
})();
cost(100);//100
cost(200);//200
cost();//300

 

4.函数节流

函数节流的思想就是让一些频繁执行的函数减少执行频率;比如因为浏览器窗口变化引起resize事件的频繁执行,mouseover,上传进度等等。

var throttle = function(fn,interval){
    var _self = fn,timer,firstTime;
    return function(){
        var args = arguments,_me = this;
        if(firstTime){
            _self.apply(_me,args);
            return firstTime = false;
        }
        if(timer){
            return false;
        }
        timer = setTimeout(function(){
            clearTimeout(timer);
            timer = null;
            _self.apply(_me,args);
        },interval||500);
    }
};
window.onresize = throttle(function(){
    console.log(1)},500);

代码的解决办法是利用定时器延迟执行,如果定时器在规定时间后还没执行完,那么,下一次执行的时候就不会执行,直接返回;

 5.分时函数

分时函数应用的场景比如,你的QQ好友有上千个,每一个好友是一个dom,这是加载的时候浏览器可能吃不消,就要用到setInterval函数来延迟加载。

//ary需要加载的数据,fn加载逻辑,count每一批加载的个数
var
timeChunk = function(ary,fn,count){ var obj, t; var len = ary.length; var start = function(){ for(var i=0;i<Math.min(count||1,ary.length);i++){ var obj = ary.shift(); fn(obj); } }; return function(){ t = setInterval(function(){ if(ary.length===0){ return clearInterval(t); } start(); },200); } }
var ary = [];
for(var i=0;i<1000;i++){
ary.push(i);
}
var renderFirendList = timeChunk(ary,function(n){
var div = document.createElement(‘div‘);
div.innerHTML = n;
document.body.appendChild(div);
},8);
renderFirendList();

 6.惰性加载函数

惰性 加载函数也很常见,比如浏览器嗅探中的时间绑定函数

var addEvent = function(elem,type,handler){
    if(window.addEventListener){
        return elem.addEventListener(type,handler,false);
    }
    if(window.addEvent){
        return elem.addEvent(‘on‘+type,handler);
    }
}

 

 以上代码在非IE浏览器下每次都不会走第二个分支,并且每次添加一个事件就会执行一次判断,虽然这不会增加性能开销,但是可以利用惰性加载来解决

var addEvent = function(elem, type, handler){
    if(window.addEventListener){
        addEvent = function(elem, type, handler){
            elem.addEventListener(type, handler, false)
        }
    }else if(window.addEvent){
        addEvent = function(elem, type, handler){
            elem.addEvent(‘on‘+type, handler);
        }
    }
    addEvent(elem,type,handler);
}

 二.this

this的判断只要记住一点,就是在执行的时候动态绑定的,以下是优先级

if(hava new){

  this 就是new返回的这个对象

}else if(hava call,apply 绑定){

  apply,call绑定的那个对象就是this

}else if(有对象调用){

  this就是这个调用的对象

}else{

  默认绑定到window

}

《javascript设计模式与开发实践》读书笔记(一)

标签:

原文地址:http://www.cnblogs.com/bdbk/p/4764458.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!