摘要:這道的面試題,是這樣的,頁面上有一個按鈕,一個,點擊按鈕的時候,每隔秒鐘向的后面追加一個一共追加個,的內容從開始技術,首先我們用閉包封裝一個創建元素的函數頁面上的個元素點我代碼點擊按鈕的時候,用回調函數嵌套方式,這里我加入個,就已經快受不了
這道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個元素:
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
這樣封裝之后,我們的異步隊列就變得通用一點了,把延時和業務邏輯分開處理
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88477.html
摘要:設計模式的定義在面向對象軟件設計過程中針對特定問題的簡潔而優雅的解決方案。從前由于使用的局限性,和做的應用相對簡單,不被重視,就更談不上設計模式的問題。 ‘從大處著眼,從小處著手’,以前對這句話一知半解,自從踏出校門走入社會,開始工作以來,有了越來越深的理解,偶有發現這句話用在程序開發中也有用,所以,近段時間開始嘗試著分析jQuery源碼,分析angularjs源碼,學習設計模式。 設...
摘要:平日學習接觸過的網站積累,以每月的形式發布。年以前看這個網址概況在線地址前端開發群月報提交原則技術文章新的為主。 平日學習接觸過的網站積累,以每月的形式發布。2017年以前看這個網址:http://www.kancloud.cn/jsfron... 概況 在線地址:http://www.kancloud.cn/jsfront/month/82796 JS前端開發群月報 提交原則: 技...
閱讀 1639·2021-09-02 09:55
閱讀 1105·2019-08-30 13:19
閱讀 1402·2019-08-26 13:51
閱讀 1451·2019-08-26 13:49
閱讀 2379·2019-08-26 12:13
閱讀 459·2019-08-26 11:52
閱讀 1907·2019-08-26 10:58
閱讀 3088·2019-08-26 10:19