发表于: 2019-11-16 23:15:21

1 1040


今天完成的事:

复习css和js深度思考,准备复盘评审

明天计划的事:

继续复习知识点

遇到的问题:

暂无

收获:

闭包

闭包指有权访问另一个函数内部变量的函数,当在函数内部定义了其他函数,也就创建了闭包

谈谈你对闭包的理解

使用闭包可以模仿块级作用域

优点:可以避免全局变量的污染,实现封装和缓存;

缺点:闭包会常驻内存,增大内存使用量,使用不当很容易造成内存泄漏。解决方法:在退出函数之前,将不适用的局部变量设为null。

闭包最大的两个用处:1.可以读取函数内部的变量;2.使这些变量始终保存在内存中;3.封装对象的私有属性和私有方法

说说你对作用域链的理解

作用域链的作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能享受访问,访问到window对象即被终止。

简单来说,作用域就是变量和函数的可访问范围

如何创建块级作用域

  • ES6 使用let和const
  • 闭包

BOM

BOM对象有哪些?

  • window        JS最顶层对象
  • location      浏览器当前URL信息
  • navigator     浏览器本身信息
  • screen        客户端屏幕信息
  • history       浏览器访问历史信息

window对象的方法

alert(),prompt(),confirm(),open(),close(),print(),focus(),blur(),moveBy(),moveTo(),resizeBy(),resizeTo(),scrollBy(),scrollTo(),setInterval(),setTimeout(),clearInterval(),clearTimeout()

history对象

history.go(-1);     // 后退一页 history.go(1);      // 前进一页 history.back();     // 后退一页 history.forward();  // 前进一页 复制代码

窗口位置

  • 跨浏览器取得窗口左边和上边的位置
var leftPos=(typeof window.screenLeft == 'number') ? window.screenLeft : window.screenX; var topPos=(typeof window.screenTop == 'number') ? window.screenTop : window.screenY; 复制代码
  • 将窗口移动到指定位置

moveTo():接收新位置的x,y坐标值

moveBy():接收在水平垂直方向上移动的像素数

窗口大小

outerWidth和outerHeight返回浏览器窗口本身的尺寸,innerWidth和innerHeight返回容器视图区的大小

  • 调整窗口大小 resizeTo()和resizeBy()

如何检测浏览器的类型

使用navigator.userAgent

var ua = navigator.userAgent; var isChrome = ua.indexOf('Chrome') 复制代码

拆解url的各部分

使用location的属性

  • href          完整url地址
  • protocol      协议
  • host          主机名+端口号
  • hostname      主机名
  • port          端口号
  • pathname      相对路径
  • hash          #锚点
  • search        ?查询字符串
history.go(1) 复制代码

DOM

为什么操作DOM慢?

因为DOM属于渲染引擎的东西,JS又是JS引擎的东西,当我们通过JS操作DOM的时候,涉及到两个线程间的通信,而且操作DOM可能会带来重绘回流的情况,所以就导致了性能问题。

插入几万个DOM,如何实现页面不卡顿?

  • 1.分批次部分渲染DOM,通过requestAnimationFrame去循环插入DOM
  • 2.虚拟滚动,只渲染可视区域内的内容

什么情况阻塞渲染

  • 1.HTML和CSS都会阻塞渲染,如果想渲染快就应该降低一开始渲染的文件大小,扁平层级,优化选择器
  • 2.浏览器解析到script标签时会暂停构建DOM,

解决方法

  • ①将script标签放到body底部
  • ②给script标签加上defer属性,该JS文件会并行下载但等到HTML解析完后顺序执行
  • ③script标签加上async属性,表示JS文件下载和解析不会阻塞渲染

重绘Repaint和回流Reflow

重绘是当节点改变样式而不影响布局,回流是当布局或几何属性需要改变

回流必定会发生重绘,回流的成本比重绘高

性能问题:1.改变window大小 2.改变字体 3.添加或删除样式 4.文字改变 5.定位或浮动 6.盒模型

减少重绘和回流

  • 1.使用transform替代top
  • 2.使用visibility换成display:none,前者只引起重绘,后者引发回流
  • 3.不要把节点的属性值放在一个循环里当成循环里的变量
  • 4.不要使用table布局
  • 5.动画实现的动画速度越快,回流次数越多,也可使用requestAnimationFrame
  • 6.CSS选择符从右往左匹配,避免节点层级过多
  • 7.将频繁重绘或回流的节点设置为图层 ①will-change属性 ②video, iframe标签

创建节点

  • createElement 创建一个元素
  • createTextNode 创建一个文本节点
  • createDocumentFragment 创建一个文档片段
  • cloneNode 返回调用该方法的节点的一个副本

注意事项:

  • 以上只是创建一个孤立的节点,需要通过appendChild添加到文档中
  • cloneNode要注意被复制的节点是否包含子节点以及事件绑定等问题
  • 使用createDocumentFragment来解决添加大量节点时的性能问题

页面修改API

  • appendChild() 添加子节点
  • insertBefore() 添加节点到参考节点之前 parentNode.insertBefore(newNode, refNode) parentNode表示父节点,newNode表示要添加的节点,refNode表示参照节点
  • removeChild() 删除子节点
  • replaceChild() 替换 parent.replaceChild(newChild,oldChild)

节点查询API

  • document.getElementById
  • document.getElementsByTagName
  • document.getElementsByName
  • document.getElementsByClassName
  • document.querySelector // 返回第一个匹配的元素
  • document.querySelectorAll

节点关系型API

  • parentNode // 父节点
  • parentElement // 父节点,必须是element
  • childNodes  // 子元素列表,包含文本,注释节点
  • children    // 子元素列表
  • firstChild  // 第一个子节点
  • lastChild   // 最后一个子节点
  • hasChildNodes   // 判断当前节点是否有子节点
  • previousSibling // 前一个兄弟节点
  • previousElementSibling  // 前一个兄弟元素节点
  • nextSibling     // 后一个兄弟节点
  • nextElementSibling      // 后一个兄弟元素节点

元素属性API

  • setAttribute 设置属性 element.setAttribute(name, value)
  • getAttribute 返回属性值
  • removeAttribute 删除属性

元素样式API

  • window.getComputedStyle 返回元素计算后的样式
  • getBoundingClientRect 返回元素大小以及相对于浏览器可视窗口的位置
  • 直接修改元素的样式
ele.style.color = 'red' ele.style.setProperty('font-size', '16px') ele.style.removeProperty('color') 复制代码
  • 动态添加样式规则
var style = document.createElement('style'); style.innerHTML='body{color:red;} #top{color:white;}'; document.head.appendChild(style); 复制代码

attribute和property的区别是什么?

attribute是dom元素在文档中作为HTML标签拥有的属性

prototype是dom元素在JS中作为对象拥有的属性

JS如何设置获取盒模型对于的宽和高?

  • 获取内联元素的宽高 dom.style.width/height
  • 只适用在IE中获取元素宽高 dom.currentStyle.width/height
  • 获取元素宽高,兼容性较好 window.getCompontedStyle(dom).width/height
  • 根据元素在视窗中的绝对位置获取宽高 dom.getBoundingClientRect().width/height
  • 最常用,兼容性最好 dom.offsetWidth/offsetHeight

offsetWidth/offsetHeight,clientWidth/clientHeight与srcollWidth/scrollHeight的区别

  • offsetWidth/offsetHeight返回包含content+padding+border,效果与e.getBoundingClientRect()相同
  • clientWidth/clientHeight返回包含content+padding,如果有滚动条,也不包含滚动条
  • scrollWidth/scrollHeight返回包含content+paddin+溢出内容的尺寸

document.write和innerHTML的区别

  • document.write只能重绘整个页面
  • innerHTML可以重绘页面的一部分



返回列表 返回列表
评论

    分享到