1.说说你对闭包的理解
使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。
闭包有三个特性:
- 函数嵌套函数
- 函数内部可以引用外部的参数和变量
- 参数和变量不会被垃圾回收机制回收
2.call() 和 .apply() 的区别和作用?
作用:动态改变某个类的某个方法的运行环境。
1、call,apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例(就是每个方法)都有call,apply属性。既然作为方法的属性,那它们的使用就当然是针对方法的了,这两个方法是容易混淆的,因为它们的作用一样,只是使用方式不同。
2、语法:foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments) == this.foo(arg1, arg2, arg3);
3、相同点:两个方法产生的作用是完全一样的。
4、不同点:方法传递的参数不同。
3.javascript里面的继承怎么实现,如何避免原型链上面的对象共享
用构造函数和原型链的混合模式去实现继承,避免对象共享可以参考经典的extend()函数,很多前端框架都有封装的,就是用一个空函数当做中间变量
4.JavaScript原型,原型链 ? 有什么特点?
原型对象也是普通的对象,是对象一个自带隐式的 proto 属性,原型也有可能有自己的原型,如果一个原型对象的原型不为null的话,我们就称之为原型链。
原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链。
5.你如何对网站的文件和资源进行优化
- 文件合并
- 文件最小化/文件压缩
- 使用 CDN 托管
- 缓存的使用(多个域名来提供缓存)
- 其他
6.请说出三种减少页面加载时间的方法。
- 优化图片
- 图像格式的选择(GIF:提供的颜色较少,可用在一些对颜色要求不高的地方)
- 优化CSS
- 压缩合并css,如margin-top,margin-left...
- 网址后加斜杠(
- 如www.campr.com/目录,会判断这个“目录是什么文件类型,或者是目录。
- 标明高度和宽度
- 如果浏览器没有找到这两个参数,它需要一边下载图片一边计算大小,如果图片很多,浏览器需要不断地调整页面。这不但影响速度,也影响浏览体验。当浏览器知道了高度和宽度参数后,即使图片暂时无法显示,页面上也会腾出图片的空位,然后继续加载后面的内容。从而加载时间快了,浏览体验也更好了。
- 减少http请求
- 合并文件,合并图片
7.Javascript继承的6种方法
- 原型链继承
- 借用构造函数继承
- 组合继承(原型+借用构造)
- 原型式继承
- 寄生式继承
- 寄生组合式继承
8.Javascript对象的几种创建方式
- 工厂模式
- 构造函数模式
- 原型模式
- 混合构造函数和原型模式
- 动态原型模式
- 寄生构造函数模式
- 稳妥构造函数模式
9.你有哪些性能优化的方法?
详情请看雅虎14条性能优化原则
- 减少http请求次数
- CSS Sprites, JS、CSS源码压缩、图片大小控制合适;网页Gzip,CDN托管,data缓存 ,图片服务器
- 前端模板 JS+数据
- 减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数
- 用innerHTML代替DOM操作
- 减少DOM操作次数,优化javascript性能
- 当需要设置的样式很多时设置className而不是直接操作style
- 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作
- 避免使用CSS表达式又称Dynamic properties(动态属性)
- 图片预加载
- 将样式表放在顶部,将脚本放在底部
10.平时如何管理你的项目?
- 先期团队必须确定好全局样式(globe.css),编码模式(utf-8) 等
- 编写习惯必须一致
- 例如都是采用继承式的写法,单样式都写成一行
- 标注样式编写人,各模块都及时标注
- 标注关键样式调用的地方
- 页面进行标注
- 例如页面模块开始和结束
- CSS跟HTML 分文件夹并行存放,命名都得统一
- JS 分文件夹存放 命名以该JS功能为准的英文翻译
11.什么是闭包,闭包什么情况会导致内存溢出?
直接来讲,闭包就是能够读取其他函数内部变量的函数,在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数",所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。闭包最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
11.1 闭包引起内存泄露的原因
- 循环引用导致了内存泄漏
- 由外部函数调用引起的内存泄漏
11.2 避免内存泄漏
- 打破循环引用
- 添加另一个闭包
- 避免闭包自身
11.3 解决闭包
用完直接==null;