2017面试题1
AMD 和 CMD 的区别有哪些?
区别:
1. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible.
2. CMD 推崇依赖就近,AMD 推崇依赖前置。看代码:
// CMD
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
// 此处略去 100 行
var b = require('./b') // 依赖可以就近书写
b.doSomething()
// ...
})
// AMD 默认推荐的是
define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好
a.doSomething()
// 此处略去 100 行
b.doSomething()
...
})
虽然 AMD 也支持 CMD 的写法,同时还支持将 require 作为依赖项传递,但 RequireJS 的作者默认是最喜欢上面的写法,也是官方文档里默认的模块定义写法。
3. AMD 的 API 默认是一个当多个用,CMD 的 API 严格区分,推崇职责单一。比如 AMD 里,require 分全局 require 和局部 require,都叫 require。CMD 里,没有全局 require,而是根据模块系统的完备性,提供 seajs.use 来实现模块系统的加载启动。CMD 里,每个 API 都简单纯粹。
4. 还有一些细节差异,具体看这个规范的定义就好,就不多说了。
MVC,MVP 和 MVVM
mvc
- View 传送指令到 Controller
- Controller 完成业务逻辑后,要求 Model 改变状态
- Model 将新的数据发送到 View,用户得到反
接受用户指令时,MVC 可以分成两种方式。一种是通过 View 接受指令,传递给 Controller。另一种是直接通过controller接受指令。
MVP
模式将 Controller 改名为 Presenter,同时改变了通信方向。
1. 各部分之间的通信,都是双向的。
2. View 与 Model 不发生联系,都通过 Presenter 传递。
3. View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。
MVVM
模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。
唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。Angular 和 Ember 都采用这种模式
5 JavaScript内存管理
JS中内存的分配和回收都是自动完成的,内存在不使用的时候会被垃圾回收器自动回收。
简单的说,js是这样管理内存的:
找出那些不再继续使用的变量,然后释放其中占用的内存。为此,垃圾收集器会按照固定的时间间隔(或代码执行中预设的收集时间),周期性的执行这一操作.
对垃圾回收算法来说,核心思想就是如何判断内存已经不再使用了。下面介绍两种常见浏览器的垃圾回收算法。
1 标记清除 (主流做法)
2 引用计数法,跟踪记录每个值的被引用次数。
6 JS中Null与Undefined的区别
在JavaScript中存在这样两种原始类型:Null与Undefined。
Undefined类型只有一个值,即undefined。当声明的变量还未被初始化时,变量的默认值为undefined。
Null类型也只有一个值,即null。null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。
7 闭包是什么?闭包如何避免内存循环引用。
闭包是在某个作用域内定义的函数,它可以访问这个作用域内的所有变量。
参考 http://blog.csdn.net/liangklfang/article/details/48543917
方法一、主动设置js对象element为空,打破循环引用
function assignHandler()
{
var element=document.getElementById("div1");
var id=element.id;
element.onclick=function() //element的onclick引用了函数funciton,function通过闭包引用了element,照成循环引用
{
alert(id+element+sex);
}
/*闭包可以监听外部变量的变化,所以这里把element=null,也就是说外部这个变量相当于不存在了,虽然赋值是在闭包后面,闭包也能够检测到!所以匿名函数不会有外部的DOM对象的引用,不会内存泄漏*/
var sex="female";
element=null;
}
方法二、通过添加另外一个闭包来避免JS对象和DOM对象之间的循环引用
window.onload=function outerFunction()
{
var anotherObj=function innerFunction()
{
alert("I have avoided the leak!");
}
//通过另外一个闭包来避免JS对象和DOM对象之间的循环引用
function anotherInnerFunction()
{
var obj=document.getElementById("div1");
//DOM对象引用了anotherObj函数,但是anotherObj函数无法引用DOM对象
obj.onclick=anotherObj;
};
anotherInnerFunction();
}
方法三、通过添加另一个函数来避免闭包本身,进而阻止内存泄漏
window.onload=function()
{
var obj=document.getElementById("div1");
obj.onclick=doesNotLeak;
}
//该函数无法访问上面匿名函数中间的obj对象,从而可以阻止内存泄漏!
function doesNotLeak()
{
alert("我已经阻止内存泄漏了!");
}
7 解释下浮动和它的工作原理?清除浮动的技巧
浮动元素脱离文档流,不占据空间。
1、<div style="clear:both;"></div>
2、.clearfix:after {content:"."; display:block; height:0; visibility:hidden; clear:both; }
.clearfix { *zoom:1; } //为了适配ie6
3,设置`overflow`为`hidden`或者auto
8 iframe
iframe是一种框架,也是一种很常见的网页嵌入方式,零度今天给大家分析分析它的优缺点。
iframe的优点:
1.iframe能够原封不动的把嵌入的网页展现出来。
2.如果有多个网页引用iframe,那么你只需要修改iframe的内容,就可以实现调用的每一个页面内容的更改,方便快捷。
3.网页如果为了统一风格,头部和版本都是一样的,就可以写成一个页面,用iframe来嵌套,可以增加代码的可重用。
4.如果遇到加载缓慢的第三方内容如图标和广告,这些问题可以由iframe来解决。
iframe的缺点:
1.会产生很多页面,不容易管理。
2.iframe框架结构有时会让人感到迷惑,如果框架个数多的话,可能会出现上下、左右滚动条,会分散访问者的注意力,用户体验度差。
3.代码复杂,无法被一些搜索引擎索引到,这一点很关键,现在的搜索引擎爬虫还不能很好的处理iframe中的内容,所以使用iframe会不利于搜索引擎优化。
4.很多的移动设备(PDA 手机)无法完全显示框架,设备兼容性差。
5.iframe框架页面会增加服务器的http请求,对于大型网站是不可取的。
分析了这么多,现在基本上都是用Ajax来代替iframe,所以iframe已经渐渐的退出了前端开发。
求y 和 z 的值
var x =1
var y = 0
var z = 0
function add(n){n=n+1}
y=add(x)
function add(n){n=n+3}
z=add(x)
underfined