閉包

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>閉包</title>
    </head>
    <body>
    </body>
    <script>
//子函數(shù)可以訪問到父級函數(shù)的作用域鸟妙,這種現(xiàn)象稱為閉包
    let arr=[1,23,4,6,17,3,10,2,5,7,9];
    //選出5到9之間的數(shù)
    let a=arr.filter(function(v){
        return v>=5&&v<=9;
    });
    console.log(a);
    //選出3到7之間的數(shù)
    let b=arr.filter(function(v){
        return v>=3&&v<=7;
    });
    console.log(b);
//考慮函數(shù)復用,子函數(shù)可以return父級作用域的某些數(shù)據(jù),這是閉包的一個很大的特性
    function between(a,b){
        return function(v){
            return v>=a&&v<=b;
        }
    }
    let c=arr.filter(between(2,8));
    console.log(c);
    
    </script>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>移動動畫的閉包使用</title>
    </head>
    <style>
        button{
            position: absolute;
            left:0;
        }
    </style>
    <body>
        <button>hao</button>
        <button>yangdingchuan</button>
    </body>
    <script>
        let btns=document.querySelectorAll('button');
        [...btns].forEach(function(item){
            let left=1;
            let sitid=false;
            item.addEventListener('click',function(e){
//問題一妹蔽、如果left在這里定義,點擊第二次時會出現(xiàn)抖動姜挺,因為每次點擊都會觸發(fā)使left重新定義
        //解決辦法是把left放到點擊事件外部定義
                //let left=1;
//問題二、left放到點擊事件外部定義辜王,解決了抖動但是會在每次點擊都會加速按鈕的移動
//因為每次點擊都會重新創(chuàng)建一個定時器逢唤,這樣點擊10次就是創(chuàng)建10個定時器肆氓,不是每100ms的速度移動了
//而成了每10ms自增的速度了
            /* setInterval(function(){
                        item.style.left=`${left++}px`;
                },100); */
            
            //解決辦法:存一個標志,如果定時器已經建立了就不在重復創(chuàng)建了
            if(sitid==false){
                sitid=true;
                setInterval(function(){
                            item.style.left=`${left++}px`;
                    },100);
            }
            });
        });
    </script>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>利用閉包根據(jù)字段排序商品</title>
    </head>
    <body>
    </body>
    <script>
        let goods=[
            {
                name:'banana',
                price:10,
                click:30
            },
            {
                name:'apple',
                price:5,
                click:40
            },
            {
                name:'grape',
                price:15,
                click:32
            }
        ];
        //按價格升序
        let g0=goods.sort(function(a,b){
            return a.price>b.price?1:-1;
        });
        console.log(g0);
        //按點擊次數(shù)降序
        let g1=goods.sort(function(a,b){
            return a.click<b.click?1:-1;
        });
        console.log(g1);
        //考慮代碼復用
        function order(field){
            return function(a,b){
                //升序
                return a[field]>b[field]?1:-1;
                //降序
                //return a[field]<b[field]?1:-1;
            }
        }
        let g2=goods.sort(order("price"));
        console.log(g2);
    </script>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>閉包的內存泄露解決辦法</title>
    </head>
    <body>
        <div name='haoxuejie'>郝雪潔</div>
        <div name='yangdingchuan'>楊定川</div>
    </body>
    <script>
        let divs=document.querySelectorAll("div");
        /* [...divs].forEach(function(item){
            item.addEventListener('click',function(){
                console.log(item.getAttribute('name'));
                console.log(item);
            });
            //每次都會在內存中存大量的dom節(jié)點怖辆,
            //如果dom元素內容比較多是复,會引起內存泄露
        }); */
        //改進辦法
        [...divs].forEach(function(item){
            let name=item.getAttribute('name');
            item.addEventListener('click',function(){
                console.log(name);
                console.log(item);//null
            });
            item=null;//及時清理內存,可以使程序運行更快一些
        });
    </script>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>this在閉包中的歷史遺留問題</title>
    </head>
    <body>
    </body>
    <script>
        let hxj={
            user:"haoxuejie",
            get:function(){
                return this.user;
            },
            get0:function(){
                return function(){
                    return this.user;
                }
            },
            get1:function(){
                return ()=>{
                    return this.user;
                }
            }
        };
        let h=hxj.get();
        console.log(h);//haoxuejie
        let x=hxj.get0();
        console.log(x);//是一個函數(shù)
        console.log(x());//undefined,因為此時x是全局對象竖螃,它的this指向的是window,window里面沒有user這個變量
//使用箭頭函數(shù)解決上述問題,get1()內部定義的返回函數(shù)是使用箭頭函數(shù)定義的
        let j=hxj.get1();
        console.log(j);//輸出一個箭頭函數(shù)
        console.log(j());//haoxuejie
            
    </script>
</html>
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末淑廊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子特咆,更是在濱河造成了極大的恐慌季惩,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腻格,死亡現(xiàn)場離奇詭異画拾,居然都是意外死亡,警方通過查閱死者的電腦和手機荒叶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門碾阁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人些楣,你說我怎么就攤上這事脂凶。” “怎么了愁茁?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵蚕钦,是天一觀的道長。 經常有香客問我鹅很,道長嘶居,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任促煮,我火速辦了婚禮邮屁,結果婚禮上,老公的妹妹穿的比我還像新娘菠齿。我一直安慰自己佑吝,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布绳匀。 她就那樣靜靜地躺著芋忿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疾棵。 梳的紋絲不亂的頭發(fā)上戈钢,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音是尔,去河邊找鬼殉了。 笑死,一個胖子當著我的面吹牛嗜历,可吹牛的內容都是我干的宣渗。 我是一名探鬼主播抖所,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼痕囱!你這毒婦竟也來了田轧?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鞍恢,失蹤者是張志新(化名)和其女友劉穎傻粘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帮掉,經...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡弦悉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蟆炊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稽莉。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涩搓,靈堂內的尸體忽然破棺而出污秆,到底是詐尸還是另有隱情,我是刑警寧澤昧甘,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布良拼,位于F島的核電站,受9級特大地震影響充边,放射性物質發(fā)生泄漏庸推。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一浇冰、第九天 我趴在偏房一處隱蔽的房頂上張望贬媒。 院中可真熱鬧,春花似錦肘习、人聲如沸掖蛤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至致讥,卻和暖如春仅仆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垢袱。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工墓拜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人请契。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓咳榜,卻偏偏與公主長得像夏醉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子涌韩,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容