设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

中高级前端大厂面试秘籍,为你保驾护航金三银四,直通大厂(10)

发布时间:2019-02-20 20:16 所属栏目:21 来源:佚名
导读:check 执行 setImmediate close callbacks 跨域 JSONP: 利用 script 标签不受跨域限制的特点,缺点是只能支持 get 请求 functionjsonp(url,jsonpCallback,success){ constscript=document.createElement('script')

check

  • 执行setImmediate
  • close callbacks
  • 跨域

    • JSONP: 利用<script>标签不受跨域限制的特点,缺点是只能支持 get 请求
    1. function jsonp(url, jsonpCallback, success) { 
    2.   const script = document.createElement('script') 
    3.   script.src = url 
    4.   script.async = true 
    5.   script.type = 'text/javascript' 
    6.   window[jsonpCallback] = function(data) { 
    7.     success && success(data) 
    8.   } 
    9.   document.body.appendChild(script) 
    • 设置 CORS: Access-Control-Allow-Origin:*
    • postMessage

    安全

    • XSS攻击: 注入恶意代码

      • cookie 设置 httpOnly
      • 转义页面上的输入内容和输出内容
    • CSPF: 跨站请求伪造,防护:

      • get 不修改数据
      • 不被第三方网站访问到用户的 cookie
      • 设置白名单,不被第三方网站请求
      • 请求校验

    框架:Vue

    1. nextTick

    在下次dom更新循环结束之后执行延迟回调,可用于获取更新后的dom状态

    • 新版本中默认是mincrotasksv-on中会使用macrotasks
    • macrotasks任务的实现:

      • setImmediate / MessageChannel / setTimeout

    2. 生命周期

    • _init_

      • initLifecycle/Event,往vm上挂载各种属性
      • callHook: beforeCreated: 实例刚创建
      • initInjection/initState: 初始化注入和 data 响应性
      • created: 创建完成,属性已经绑定, 但还未生成真实dom
      • 进行元素的挂载: $el / vm.$mount()
      • 是否有template: 解析成render function

        • *.vue文件: vue-loader会将<template>编译成render function
      • beforeMount: 模板编译/挂载之前
      • 执行render function,生成真实的dom,并替换到dom tree
      • mounted: 组件已挂载
    • update:

      • 执行diff算法,比对改变是否需要触发UI更新
      • flushScheduleQueue

        • watcher.before: 触发beforeUpdate钩子 - watcher.run(): 执行watcher中的 notify,通知所有依赖项更新UI
      • 触发updated钩子: 组件已更新
    • actived / deactivated(keep-alive): 不销毁,缓存,组件激活与失活
    • destroy:

      • beforeDestroy: 销毁开始
      • 销毁自身且递归销毁子组件以及事件监听

        • remove(): 删除节点
        • watcher.teardown(): 清空依赖
        • vm.$off(): 解绑监听
      • destroyed: 完成后触发钩子

    上面是vue的声明周期的简单梳理,接下来我们直接以代码的形式来完成vue的初始化

    1. new Vue({}) 
    2.  
    3. // 初始化Vue实例 
    4. function _init() { 
    5.      // 挂载属性 
    6.     initLifeCycle(vm)  
    7.     // 初始化事件系统,钩子函数等 
    8.     initEvent(vm)  
    9.     // 编译slot、vnode 
    10.     initRender(vm)  
    11.     // 触发钩子 
    12.     callHook(vm, 'beforeCreate') 
    13.     // 添加inject功能 
    14.     initInjection(vm) 
    15.     // 完成数据响应性 props/data/watch/computed/methods 
    16.     initState(vm) 
    17.     // 添加 provide 功能 
    18.     initProvide(vm) 
    19.     // 触发钩子 
    20.     callHook(vm, 'created') 
    21.          
    22.      // 挂载节点 
    23.     if (vm.$options.el) { 
    24.         vm.$mount(vm.$options.el) 
    25.     } 
    26.  
    27. // 挂载节点实现 
    28. function mountComponent(vm) { 
    29.      // 获取 render function 
    30.     if (!this.options.render) { 
    31.         // template to render 
    32.         // Vue.compile = compileToFunctions 
    33.         let { render } = compileToFunctions()  
    34.         this.options.render = render 
    35.     } 
    36.     // 触发钩子 
    37.     callHook('beforeMounte') 
    38.     // 初始化观察者 
    39.     // render 渲染 vdom,  
    40.     vdom = vm.render() 
    41.     // update: 根据 diff 出的 patchs 挂载成真实的 dom  
    42.     vm._update(vdom) 
    43.     // 触发钩子   
    44.     callHook(vm, 'mounted') 
    45.  
    46. // 更新节点实现 
    47. funtion queueWatcher(watcher) { 
    48.     nextTick(flushScheduleQueue) 
    49.  
    50. // 清空队列 
    51. function flushScheduleQueue() { 
    52.      // 遍历队列中所有修改 
    53.     for(){ 
    54.         // beforeUpdate 
    55.         watcher.before() 
    56.           
    57.         // 依赖局部更新节点 
    58.         watcher.update()  
    59.         callHook('updated') 
    60.     } 
    61.  
    62. // 销毁实例实现 
    63. Vue.prototype.$destory = function() { 
    64.      // 触发钩子 
    65.     callHook(vm, 'beforeDestory') 
    66.     // 自身及子节点 
    67.     remove()  
    68.     // 删除依赖 
    69.     watcher.teardown()  
    70.     // 删除监听 
    71.     vm.$off()  
    72.     // 触发钩子 
    73.     callHook(vm, 'destoryed') 

    3. 数据响应(数据劫持)

    (编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读