• 阿里前端二面(笔试/机试)总结


    这一轮答的并不理想,很有可能挂掉。回来之后自己又答了一遍,没有参考任何资料,居然全部答上了。

    到底还是自己的基本功不扎实,遇见没做过的东西,没有调试环境就慌了,再努力提高吧。

    一、实现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>
  • 相关阅读:
    SpringMVC_HelloWorld_02
    SpringMVC_HelloWorld_01
    设计模式之笔记--解释器模式(Interpreter)
    设计模式之笔记--命令模式(Command)
    设计模式之笔记--职责链模式(Chain of Responsibility)
    设计模式之笔记--代理模式(Proxy)
    设计模式之笔记--享元模式(Flyweight)
    设计模式之笔记--外观模式(Facade)
    闲居即兴
    nacos
  • 原文地址:https://www.cnblogs.com/sunken/p/4390866.html
Copyright © 2020-2023  润新知