《javascript設計模式與開發實踐》讀書筆記(一)

來源:互聯網
上載者:User

標籤:

一.高階函數

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);//100cost(200);//200cost();//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設計模式與開發實踐》讀書筆記(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.