作用域
作⽤域和作⽤域链的理解作⽤域
在ES5中,全局是⼀个作⽤域,函数也会产⽣作⽤域。
在ES6中,代码块、let、const等都会有属于⾃⼰的作⽤域。
作⽤域链
当进⼊到⼀个执⾏上下⽂时,执⾏上下⽂会关联⼀个作⽤域链。
通常作⽤域链在解析时就被确定,作⽤域链与函数的定义位置有关,与它的调⽤位置⽆关
什么是变量提升、函数提升?变量提升:
简单说就是在js代码执⾏前引擎会先进⾏预编译,预编译期间会将变量声明与函数声明提升⾄其对应作⽤域的最顶端,函数内声明的变量只会提升⾄该函数作⽤域最顶层。
当函数内部定义的⼀个变量与外部相同时,那么函数体内的这个变量就会被上升到最顶端。
举个例⼦,如:
console.log(a); // undefined
var a = 3; // 会将var a 的声明提升⾄最顶端
函数提升
函数提升只会提升函数声明式写法,函数表达式的写法不存在函数提升。
函数提升的优先级⼤于变量提升的优先级,即函数提升在变量提升之上。
this绑定
this绑定this的绑定规则有⼏种?
默认绑定:独⽴函数调⽤,函数没有被绑定到某个对象上进⾏调⽤
隐式绑定:通过某个对象发起的函数调⽤,在调⽤对象内部有⼀个对函数的引⽤。
显式绑定:明确this指向的对象,第⼀个参数相同并要求传⼊⼀个对象。
apply/call
bind
new绑定:
创建⼀个全新对象
新对象被执⾏prototype链接
新对象绑定到函数调⽤的this
如果函数没有返回其他对象,表达式会返回这个对象
this的⾯试题解析123456789101112131415161718192021222324252627282930313233var name = "window";function Person(name) {this.name = name;this.foo1 = function () {console.log(this.name); };this.foo2 = () => console.log(this.name);this.foo3 = function () ...
a标签下载文件
点击 a 标签下载⽂件如何做?有两种⽅式:a.download 当指定 a 标签的 download 属性时,点击该链接会直接保存为⽂件,⽂件名为
download 属性
通过对 a 标签指定的 URL 在服务器设置响应头 Content-Disposition: attachment;
filename=”filename.jpg” 可直接下载
Element与Node区别
DOM 中 Element 与 Node 有何区别Element 继承于 Node,具有 Node 的⽅法,同时⼜拓展了很多⾃⼰的特有⽅法。
不可复制
如何实现⻚⾯⽂本不可复制有 CSS 和 JS 两种⽅法,以下任选其⼀或结合使⽤
使⽤ CSS 如下:1user-select: none;
或使⽤ JS 如下,监听 selectstart 事件,禁⽌选中。
当⽤户选中⼀⽚区域时,将触发 selectstart 事件,Selection API 将会选中⼀⽚区域。禁⽌选中区域
即可实现⻚⾯⽂本不可复制。
123456document.body.onselectstart = (e) => {e.preventDefault();};document.body.oncopy = (e) => {e.preventDefault();};
prefetch和preload应用场景
preload和prefetch的应⽤场景?1.webpack优化之preload和prefetch:单⻚⾯应⽤由于⻚⾯过多,可能会导致代码体积过⼤,从⽽使得⾸⻚打开速度过慢。所以切分代码,优化⾸屏打开速度尤为重要。
但是所有的技术⼿段都不是完美的。当我们切割代码后,⾸屏的js⽂件体积减少了好多。但是也有⼀个突出的问题:
那就是当跳转其他⻚⾯的时候,需要下载相应⻚⾯的js⽂件,这就导致体验极其不好,每⼀次点击访问
新⻚⾯都要等待js⽂件下载,然后再去请求接⼝获取数据。频繁出现loading动画的体验真的不好
所以如果我们在进⼊⾸⻚后,在浏览器的空闲时间提前下好⽤户可能会点击⻚⾯的js⽂件,这样⾸屏的js
⽂件⼤⼩得到了控制,⽽且再点击新⻚⾯的时候,相关的js⽂件已经下载好了,就不再会出现loading动画
2.动态引⼊js⽂件,实现code-splitting,减少⾸屏打开时间按引⼊情况加载,只需添加注释即可
代码分割注释:/webpackChunkName: ‘mp-supports’/
prefetch注释:/* webpackPref ...