前端面试的热门问题之前端面试的热门问题之 JavaScript
一、说一下闭包一、说一下闭包
一句话可以概括:闭包就是能够读取其他函数内部变量的函数,或者子函数在外调用,子函数所在的父函数的作用域不会被释
放。
二、继承二、继承
原型链继承原型链继承
特点:基于原型链,既是父类的实例,也是子类的实例
缺点:无法实现多继承
构造继承构造继承:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型)
特点:可以实现多继承
缺点:只能继承父类实例的属性和方法,不能继承原型上的属性和方法。
实例继承实例继承:为父类实例添加新特性,作为子类实例返回
拷贝继承拷贝继承:拷贝父类元素上的属性和方法
组合继承组合继承:相当于构造继承和原型链继承的组合体。通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类
实例作为子类原型,实现函数复用
特点:可以继承实例属性/方法,也可以继承原型属性/方法
缺点:调用了两次父类构造函数,生成了两份实例
寄生组合继承:通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属
性。
三、如何解决异步回调地狱三、如何解决异步回调地狱
promise、generator、async/await
四、如何让事件先冒泡后捕获四、如何让事件先冒泡后捕获
在DOM标准事件模型中,是先捕获后冒泡。但是如果要实现先冒泡后捕获的效果,对于同一个事件,监听捕获和冒泡,分别
对应相应的处理函数,监听到捕获事件,先暂缓执行,直到冒泡事件被捕获后再执行捕获之间。
五、说一下事件委托五、说一下事件委托
事件委托指的是,不在事件的发生地(直接dom)上设置监听函数,而是在其父元素上设置监听函数,通过事件冒泡,父元素
可以监听到子元素上事件的触发,通过判断事件发生元素DOM的类型,来做出不同的响应。
好处:比较合适动态元素的绑定,新添加的子元素也会有监听函数,也可以有事件触发机制。
六、说一下图片的懒加载和预加载六、说一下图片的懒加载和预加载
预加载:提前加载图片,当用户需要查看时可直接从本地缓存中渲染。
懒加载:懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数。
七、七、mouseover和和mouseenter的区别的区别
mouseover:当鼠标移入元素或其子元素都会触发事件,所以有一个重复触发,冒泡的过程。对应的移除事件是mouseout
mouseenter:当鼠标移除元素本身(不包含元素的子元素)会触发事件,也就是不会冒泡,对应的移除事件是mouseleave
八、八、js的的new操作符做了哪些事情操作符做了哪些事情
new 操作符新建了一个空对象,这个对象原型指向构造函数的prototype,执行构造函数后返回这个对象。
九、改变函数内部九、改变函数内部this指针的指向函数(指针的指向函数(bind,,apply,,call的区别)的区别)
通过apply和call改变函数的this指向,他们两个函数的第一个参数都是一样的表示要改变指向的那个对象,第二个参数,apply
是数组,而call则是arg1,arg2…这种形式。通过bind改变this作用域会返回一个新的函数,这个函数不会马上执行。
十、异步加载十、异步加载js的方法的方法
defer:只支持IE如果您的脚本不会改变文档的内容,可将 defer 属性加入到script标签中,以便加快处理文档的速度。因为浏