zoukankan      html  css  js  c++  java
  • 阿里前端二面(笔试/机试)总结

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

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

    一、实现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>
  • 相关阅读:
    C# 操作配置文件
    C# Excel操作类
    没有找到 mspdb100.dll 的解决办法
    工厂方法模式
    .Net互操作2
    The certificate used to sign “AppName” has either expired or has been revoked. An updated certificate is required to sign and install the application解决
    手机抓包xcode自带命令行工具配合wireshark实现
    expecting SSH2_MSG_KEX_ECDH_REPLY ssh_dispatch_run_fatal问题解决
    使用ssh-keygen设置ssh无密码登录
    远程复制文件到服务器
  • 原文地址:https://www.cnblogs.com/sunken/p/4390866.html
Copyright © 2011-2022 走看看