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,反之亦然。 和 都采用这种模式
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
方法一、主动设置对象element为空,打破循环引用
function assignHandler()
{
var element=document.getElementById("div1"); var id=element.id; element.οnclick=function() //element的onclick引用了函数funciton,function通过闭包引用了element,照成循环引用 { alert(id+element+sex); } /*闭包可以监听外部变量的变化,所以这里把element=null,也就是说外部这个变量相当于不存在了,虽然赋值是在闭包后面,闭包也能够检测到!所以匿名函数不会有外部的DOM对象的引用,不会内存泄漏*/ var sex="female"; element=null;}
方法二、通过添加另外一个闭包来避免JS对象和DOM对象之间的循环引用
window.οnlοad=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.οnclick=anotherObj; }; anotherInnerFunction();}方法三、通过添加另一个函数来避免闭包本身,进而阻止内存泄漏
window.οnlοad=function()
{ var obj=document.getElementById("div1"); obj.οnclick=doesNotLeak;}//该函数无法访问上面匿名函数中间的obj对象,从而可以阻止内存泄漏!function doesNotLeak(){ alert("我已经阻止内存泄漏了!");}7 解释下浮动和它的工作原理?清除浮动的技巧
浮动元素脱离文档流,不占据空间。
1、 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