面试题
闭包:闭包就是能够读取其他函数内部变量的函数,使用闭包主要是为了设计私有的方法和变量,闭包的有点是防止全局变量的污染,缺点是闭包会常驻内存,会增大内存的使用,使用不当造成内存泄露。
作用域链:作用域链的作用是保证执行环境里有权访问的变量和函数的有序,作用域链的变量只能向上访问,变量访问到window对象即被终止,作用域链是不允许向下访问的。简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
js原型和原型链:每个对象都会在其内部初始化一个属性,就是prototype(原型)当我们访问一个对象的时候如果这个对象内部不存在这个属性,那么他就会去prototype里面找找这个属性,这个prototype又会有自己的prototype,于是一直找下去,也就是我们平时所说的原型链的概念。关系:instance.constructor.prototype = instance.__proro__;js对象是通过引用来传递的,当修改原型时,与之相关的对象也会继承这一改变。
事件代理:又称为事件委托,是js中常用绑定时间的常用技巧,顾名思义,时间代理即把原本需要绑定的事件委托给父元素,让父元素担当时间监听的职务。事件代理的原理是DOM的冒泡事件。使用事件代理的好处是提高性能。
js如何时间继承:构造继承、原型继承、实例继承、拷贝继承,
function Parent(){ this.name = 'wang'; } function Child(){ this.age = 28; } Child.prototype = new Parent();//继承了Parent,通过原型 var demo = new Child(); alert(demo.age); alert(demo.name);//得到被继承的属性
谈谈this对象的理解:this总是指向函数的直接调用者,如果有new关键字,this指向new出来的那个对象,在事件中,this指向触发这个事件的对象。
事件模型:捕获阶段、目标阶段、冒泡阶段,
冒泡事件:当你使用冒泡事件时,子级先触发,父级后触发。
捕获事件:父级元素先触发,子级后触发
DOM事件流:同时支持两种事件模型,捕获事件和冒泡事件。
new操作符具体干了什么:创建一个空对象,并且this变量引用改对象,同时继承了函数的原型。属性和方法被加入到this引用的对象中。新创建的对象由this所引用,并且最后隐式返回this
Ajax原理:ajax的原理简单来说是在用户和服务器之间加了一个中间层,通过XMLHTTPRequest对象来想服务器发异步请求,然后js来操作DOM而更新页面,使用户操作与服务器响应异步化,这其中最关键的异步就是从服务器获取请求数据。
哪些操作会造成内存泄露:
1.未使用var声明的全局变量
2。闭包
3.循环引用(两个对象相互引用)
4.setTimeout的第一个参数使用字符串
5.立即回收器定期扫描对象,并计算引用了每个对象的其他对象的数量,如果对象引用量为0,或该对象的唯一引用是循环的,那么该对象的内存即可以回收
谈谈你对webpack的看法:webpack是一个模块打包工具,你可以使用webpack管理你的依赖模块,并编译输出模块们所需的静态文件,它能很好的管理、打包web开发中所有用到的HTML、JavaScript、css以及各种静态文件(图片、字体),让开发过程更加高效,对于不同类型的资源,web有对应的加载模块。webpack打包器会分析模块间的依赖关系,最后生成了油画并且合并静态资源
用过哪些设计模式:工厂模式,构造函数模式
工厂模式:工厂模式解决了重复实例化的问题,但是有一个问题那就是无法识别,主要好处就是可以消除对象见的沟壑,使用工程方法而不是new关键字。
构造函数:使用构造函数的方法,即解决了重复实例化的问题有解决了对象识别的问题,这个就是与工厂模式的不同之处,直接将属性和方法赋值给this对象。
为什么要有同源限制:同源策略指的是:协议、域名。端口形同,同源策略是一种安全协议
js有哪些方法定义对象:
对象字面量: var obj = {};
构造函数:var obj = new Object();
Object.create(): var obj = Object.create(Object.prototype);
Promise的构造函数:构造一个Promise,最基本的用法如下:
var promise = new Promise(function(resolve,reject){ if (...) {//success resolve(result) }else { reject(Error(errMessage)) ; } })
Promise实例拥有then方法(具有then方法的对象,通常被称为thenable)。他的使用方法如下
promise.then(onFulfilled,onRejected)
渲染优化:禁止使用iframe、使用css3动画代替js动画、页面头部的style和script会阻塞页面、页面中空的href和src会阻塞其他资源的加载、使用innerHTML代替DOM操作,减少DOM操作次数、当需要设置的样式很多时设置className而不是直接操作style
css优化:
多个css合并,尽量减少http请求
将css文件放在页面最上面
避免使用css表达式
抽象提取公共样式,减少代码量
项目做过哪些优化:
- 减少
HTTP
请求数 - 减少
DNS
查询 - 使用
CDN
- 避免重定向
- 图片懒加载
- 减少
DOM
元素数量 - 减少
DOM
操作 - 使用外部
JavaScript
和CSS
- 压缩
JavaScript
、CSS
、字体、图片等 - 优化
CSS Sprite
- 使用
iconfont
- 字体裁剪
- 多域名分发划分内容到不同域名
- 尽量减少
iframe
使用 - 避免图片
src
为空 - 把样式表放在
link
中 - 把
JavaScript
放在页面底部