阿里前端二面(筆試/機試)總結


 

這一輪答的並不理想,很有可能掛掉。回來之后自己又答了一遍,沒有參考任何資料,居然全部答上了。

到底還是自己的基本功不扎實,遇見沒做過的東西,沒有調試環境就慌了,再努力提高吧。

 

一、實現jsonp,傳入URL,callback和callbackName 三個參數

 

我先說下思路,jsonp是借由script標簽發起的跨域GET請求。服務器返回的是一段js腳本,返回后可以立即執行。通過調用前端預先准備好的回調函數來獲取數據,進行下一步操作。

整個流程大概分為三個步驟:發起請求、執行服務器返回的script和垃圾回收。

需要注意的主要是服務器在調用函數的時候,我們的函數未必是暴露在全局之下的,所以要做一個指向,並在操作完成后進行清理。

 1 var index = {
 2 
 3     doSomething: function() {
 4         console.log('ok')
 5     },
 6 
 7     jsonp: function(url, callbackName, callback) {
 8 
 9         var script = document.createElement('script')
10         var body = document.querySelecotor('body')
11 
12         script.src = url + '?type=jsonp&callbackName=' + callbackName
13         script.id = 'jsonp'
14         script.onload = callback
15 
16         window[callbackName] = index.doSomething
17 
18         body.appendChild(script)
19     }
20 }
21 
22 index.jsonp('http://www.sunken.me/content', 'doSomething', function(name, script) {
23     delete window[name]
24     script.parentNode.removeChild(script)
25 })

 

 

二、實現一個計時器timer,只暴露start、stop和reset方法

 

這里考察的主要是函數作用域的概念,通過var聲明的變量是函數私有的,通過對象本身無法訪問。

 1 function timer() {
 2 
 3     var second = 0
 4     var loop = null
 5 
 6     var clear = function() {
 7 
 8         if (loop !== null) {
 9 
10             clearInterval(loop)
11             loop = null
12         }
13     }
14 
15     this.start = function() {
16 
17         loop = setInterval(function() {
18 
19             console.log(second)
20             ++second
21 
22         }, 1000)
23     }
24 
25     this.stop = function() {
26         
27         clear()
28         loop = null
29     }
30 
31     this.reset = function() {
32 
33         second = 0
34         clear()
35     }
36 }
37 
38 // 啟用timer
39 var t = new timer()
40 t.start()
41 
42 // 關閉timer
43 setTimeout(function() {
44     t.stop()
45 
46 }, 5000)

 

 

三、當點擊頁面鏈接時,驗證鏈接是否在*.taobao.com下,如果不是彈出確認提示

 

這道題主要考察兩個步驟,一是事件的綁定、處理。另一個是字符串的驗證,這里我使用了一個偷懶的做法,因為*.taobao.com應該出現在字符串首部。要考慮http/https和有http://和無幾種情況

ES 6的String.contains() 方法也可以用來做包含驗證。

 

 1 <a class="link" href="http://www.taobao.com">淘寶</a>
 2 <a class="link" href="http://www.jd.com">京東</a>
 3 
 4 <script>
 5     
 6 
 7 var link = document.getElementsByClassName('link')
 8 var listener = function(event) {
 9 
10     var e = event || window.event
11     var href = e.target.getAttribute('href')
12 
13     if (href.indexOf('.taobao.com') === -1) {
14 
15         var c = confirm('確定離開嗎')
16 
17         if (c === false) {
18 
19             e.preventDefault()
20             e.stopPropagation()
21         }
22     }
23 }
24 
25 // 綁定事件
26 for (var i = 0, len = link.length; i < len; i++) {
27 
28     link[i].addEventListener('click', listener, false)
29 }
30 
31 
32 
33 
34 </script>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM