国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[js高手之路]javascript騰訊面試題學習封裝一個簡易的異步隊列

hzx / 2030人閱讀

摘要:這道的面試題,是這樣的,頁面上有一個按鈕,一個,點擊按鈕的時候,每隔秒鐘向的后面追加一個一共追加個,的內容從開始技術,首先我們用閉包封裝一個創建元素的函數頁面上的個元素點我代碼點擊按鈕的時候,用回調函數嵌套方式,這里我加入個,就已經快受不了

這道js的面試題,是這樣的,頁面上有一個按鈕,一個ul,點擊按鈕的時候,每隔1秒鐘向ul的后面追加一個li, 一共追加10個,li的內容從0開始技術( 0, 1, 2, ....9 ),首先我們用閉包封裝一個創建li元素的函數.

1         var create = (function(){
2             var count = 0;
3             return function(){
4                 var oLi = document.createElement( "li" );
5                 oLi.innerHTML = count++;
6                 return oLi;
7             }
8         })();

頁面上的2個元素:



    js代碼:

     1 var oBtn = document.querySelector( "input" );
     2 var oBox = document.querySelector( "#box" );
     3 
     4 var create = (function(){
     5     var count = 0;
     6     return function(){
     7         var oLi = document.createElement( "li" );
     8         oLi.innerHTML = count++;
     9         return oLi;
    10     }
    11 })();
    
    12 
    13 oBtn.onclick = function(){
    14     setTimeout(function(){
    15         oBox.appendChild( create() );
    16         setTimeout( function(){
    17             oBox.appendChild( create() );
    18             setTimeout( function(){
    19                 oBox.appendChild( create() );
    20             }, 1000 );
    21         }, 1000 );
    22     }, 1000 );
    23 }
    

    點擊按鈕的時候,用回調函數嵌套方式,這里我加入3個li,就已經快受不了了,這就是javascript著名的回調地獄,那么在這里,我用循環簡化一下:

     1 var oBtn = document.querySelector("input");
     2 var oBox = document.querySelector("#box");
     3 var timer = oNode =  null;
     4 var create = (function () {
     5     var count = 0;
     6     return function () {
     7         var oLi = document.createElement("li");
     8         oLi.innerHTML = count++;
     9         return oLi;
    10     }
    11 })();
    12 function add(){
    13     oNode = oBox.appendChild( create() );
    14     if ( oNode.innerHTML < 9 ) {
    15         timer = setTimeout( add, 1000 );
    16     }else {
    17         clearTimeout( timer );
    18     }
    19 }
    20 oBtn.onclick = function () {
    21     add();
    22 }
    

    恩,確實簡化了,但是這種面向過程的方式,耦合性太強,下面呢,我就把這個封裝成一個通用隊列

    第一步:封裝一個隊列,包含( 入列,出列),隊列的特點(先進先出,如果你不懂這個,需要去補下基本的數據結構與算法內容)

    1 var Queue = function () {
     2     this.list = []
     3 }
     4 Queue.prototype = {
     5     constructor: Queue,
     6     enQueue: function ( fn ) {
     7         this.list.push( fn );
     8         return this;
     9     },
    10     deQueue: function () {
    11         var fn = this.list.shift() || function () {};
    12         fn.apply( this, arguments );
    13     }
    14 }
    

    我們來使用它:

    1 var oQ = new Queue();
     2 oQ.enQueue( function(){
     3     console.log( "ghostwu1" );
     4 }).enQueue( function(){
     5     console.log( "ghostwu2" );
     6 }).enQueue( function(){
     7     console.log( "ghostwu3" );
     8 }).deQueue();
     9 while( oQ.list.length ){
    10     oQ.deQueue();
    11 }
    

    第二步、雖然我們現在實現了一個隊列,但是,這玩意是同步的,接下來繼續改造成異步的:

     1 var oQ = new Queue();
     2 oQ.enQueue( function(){
     3     var _this = this;
     4     console.log( "ghostwu1" );
     5     setTimeout( function(){ _this.deQueue(); }, 1000 );
     6 }).enQueue( function(){
     7     var _this = this;
     8     console.log( "ghostwu2" );
     9     setTimeout( function(){ _this.deQueue(); }, 1000 );
    10 }).enQueue( function(){
    11     var _this = this;
    12     console.log( "ghostwu3" );
    13     setTimeout( function(){ _this.deQueue(); }, 1000 );
    14 }).deQueue();
    第三步、這樣就實現了一個異步隊列, 這里有個小東西要注意下,把this保存下來,因為定時器的this指向的是window.另外在封裝deQueue(出列)函數時,一定要給個空函數,否則出列完了之后,會報錯,但是這玩意還是有耦合性,繼續改造:
    
     1 
     2 
      3

      這樣封裝之后,我們的異步隊列就變得通用一點了,把延時和業務邏輯分開處理

      文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

      轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88477.html

      相關文章

      • 前端知識點整理

        摘要:難怪超過三分之一的開發人員工作需要一些知識。但是隨著行業的飽和,初中級前端就業形勢不容樂觀。整個系列的文章大概有篇左右,從我是如何成為一個前端工程師,到各種前端框架的知識。 為什么 call 比 apply 快? 這是一個非常有意思的問題。 作者會在參數為3個(包含3)以內時,優先使用 call 方法進行事件的處理。而當參數過多(多余3個)時,才考慮使用 apply 方法。 這個的原因...

        Lowky 評論0 收藏0
      • 前端知識點整理

        摘要:難怪超過三分之一的開發人員工作需要一些知識。但是隨著行業的飽和,初中級前端就業形勢不容樂觀。整個系列的文章大概有篇左右,從我是如何成為一個前端工程師,到各種前端框架的知識。 為什么 call 比 apply 快? 這是一個非常有意思的問題。 作者會在參數為3個(包含3)以內時,優先使用 call 方法進行事件的處理。而當參數過多(多余3個)時,才考慮使用 apply 方法。 這個的原因...

        snowLu 評論0 收藏0
      • 設計模式(通往高手之路必備技能)

        摘要:設計模式的定義在面向對象軟件設計過程中針對特定問題的簡潔而優雅的解決方案。從前由于使用的局限性,和做的應用相對簡單,不被重視,就更談不上設計模式的問題。 ‘從大處著眼,從小處著手’,以前對這句話一知半解,自從踏出校門走入社會,開始工作以來,有了越來越深的理解,偶有發現這句話用在程序開發中也有用,所以,近段時間開始嘗試著分析jQuery源碼,分析angularjs源碼,學習設計模式。 設...

        paraller 評論0 收藏0
      • 2017年1月前端月報

        摘要:平日學習接觸過的網站積累,以每月的形式發布。年以前看這個網址概況在線地址前端開發群月報提交原則技術文章新的為主。 平日學習接觸過的網站積累,以每月的形式發布。2017年以前看這個網址:http://www.kancloud.cn/jsfron... 概況 在線地址:http://www.kancloud.cn/jsfront/month/82796 JS前端開發群月報 提交原則: 技...

        FuisonDesign 評論0 收藏0

      發表評論

      0條評論

      hzx

      |高級講師

      TA的文章

      閱讀更多
      最新活動
      閱讀需要支付1元查看
      <