[轉載]阿里前端筆試總結
阿新 • • 發佈:2019-01-04
a.length === 0 ? a.push(1) : a.shift();2.下面程式碼會輸出什麼:
1. var test = (function(a) { 2. this.a = a; 3. return function(b) { 4. return this.a + b; 5. } 6. } (function(a, b) { 7. return a; 8. }(1, 2))); 9. 10. console.log(test(4)); //輸出什麼????首先, 這裡麵包括了自執行函式還有閉包的概念, 因為第1行到第5行的匿名函式中涉及到了閉包, 所以在第3行return的匿名函式是可以使用外部變數a的, 因此第2行的this.a和第4行的this.a裡面儲存的值是一樣的.
接著從第6行開始又有一個自執行的匿名函式, 也就是說宣告的同時(即使不呼叫)也會立即執行, 而這個函式返回的是第8行傳入引數中的第一個引數1. 這裡返回的1將會作為引數傳入到第一個匿名函式, 因此執行完第二行後this.a = a後this.a的值就變成1了. 然後返回一個匿名函式
function(b){return this.a + b;}
接著通過第1行程式碼將變數test指向這個匿名函式. 因此在第10行執行test(4)時, 就是執行返回的匿名函式, 4也就是對應函式中的引數b, 最終this.a為1, b位4, this.a+b得到的結果就是5了.
3.請把<ul><li>第1行</li><li>第2行</li>...</ul>(ul之間有10個li元素)插入body裡面,注意:需要考慮到效能問題。 分析:這題主要考察了dom操作。插入節點操作的可以使用insertBefore和appendChild方法,隨便用一個都行。但是,題目要求要考慮效能問題,這才是關鍵,因為,JavaScript操作dom的開銷是很大的!提高效能就要減少dom操作。因此,我當時使用了下面的方法,只操作一次dom就夠的了:var lis = "", ul = document.createElement("ul"); //把li以字串形式生成 for(var i = 1; i <= 10; i++) { lis += "<li>第" + i + "行</li>"; } // 最後通過innerHTML插入ul裡面 ul.innerHTML = lis; //這裡才操作dom,把ul插入到body document.body.appendChild(ul);除了上面程式碼中的方式 ( 稱為字串累加方式 ) 外, 我還使用了另外兩種方式, 包括最傳統的for迴圈還有使用documentFragment(文件片段)來實現, 使用documentFragment實現的程式碼如下: