2017面试题1
AMD 和 CMD 的區(qū)別有哪些?
區(qū)別:
1. 對(duì)于依賴的模塊,AMD 是提前執(zhí)行,CMD 是延遲執(zhí)行。不過(guò) RequireJS 從 2.0 開始,也改成可以延遲執(zhí)行(根據(jù)寫法不同,處理方式不同)。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 默認(rèn)推薦的是
define(['./a', './b'], function(a, b) { // 依賴必須一開始就寫好
a.doSomething()
// 此處略去 100 行
b.doSomething()
...
})
雖然 AMD 也支持 CMD 的寫法,同時(shí)還支持將 require 作為依賴項(xiàng)傳遞,但 RequireJS 的作者默認(rèn)是最喜歡上面的寫法,也是官方文檔里默認(rèn)的模塊定義寫法。
3. AMD 的 API 默認(rèn)是一個(gè)當(dāng)多個(gè)用,CMD 的 API 嚴(yán)格區(qū)分,推崇職責(zé)單一。比如 AMD 里,require 分全局 require 和局部 require,都叫 require。CMD 里,沒(méi)有全局 require,而是根據(jù)模塊系統(tǒng)的完備性,提供 seajs.use 來(lái)實(shí)現(xiàn)模塊系統(tǒng)的加載啟動(dòng)。CMD 里,每個(gè) API 都簡(jiǎn)單純粹。
4. 還有一些細(xì)節(jié)差異,具體看這個(gè)規(guī)范的定義就好,就不多說(shuō)了。
?
MVC,MVP 和 MVVM
mvc?
接受用戶指令時(shí),MVC 可以分成兩種方式。一種是通過(guò) View 接受指令,傳遞給 Controller。另一種是直接通過(guò)controller接受指令。
?
MVP
模式將 Controller 改名為 Presenter,同時(shí)改變了通信方向。
1. 各部分之間的通信,都是雙向的。
2. View 與 Model 不發(fā)生聯(lián)系,都通過(guò) Presenter 傳遞。
3. View 非常薄,不部署任何業(yè)務(wù)邏輯,稱為"被動(dòng)視圖"(Passive View),即沒(méi)有任何主動(dòng)性,而 Presenter非常厚,所有邏輯都部署在那里。
?
MVVM
模式將 Presenter 改名為 ViewModel,基本上與 MVP 模式完全一致。
唯一的區(qū)別是,它采用雙向綁定(data-binding):View的變動(dòng),自動(dòng)反映在 ViewModel,反之亦然。Angular?和?Ember?都采用這種模式
5?JavaScript內(nèi)存管理
JS中內(nèi)存的分配和回收都是自動(dòng)完成的,內(nèi)存在不使用的時(shí)候會(huì)被垃圾回收器自動(dòng)回收。
簡(jiǎn)單的說(shuō),js是這樣管理內(nèi)存的:
?找出那些不再繼續(xù)使用的變量,然后釋放其中占用的內(nèi)存。為此,垃圾收集器會(huì)按照固定的時(shí)間間隔(或代碼執(zhí)行中預(yù)設(shè)的收集時(shí)間),周期性的執(zhí)行這一操作.
對(duì)垃圾回收算法來(lái)說(shuō),核心思想就是如何判斷內(nèi)存已經(jīng)不再使用了。下面介紹兩種常見瀏覽器的垃圾回收算法。
1 標(biāo)記清除 (主流做法)
2?引用計(jì)數(shù)法,跟蹤記錄每個(gè)值的被引用次數(shù)。
?
6?JS中Null與Undefined的區(qū)別
在JavaScript中存在這樣兩種原始類型:Null與Undefined。
Undefined類型只有一個(gè)值,即undefined。當(dāng)聲明的變量還未被初始化時(shí),變量的默認(rèn)值為undefined。
Null類型也只有一個(gè)值,即null。null用來(lái)表示尚未存在的對(duì)象,常用來(lái)表示函數(shù)企圖返回一個(gè)不存在的對(duì)象。
?7 閉包是什么?閉包如何避免內(nèi)存循環(huán)引用。
閉包是在某個(gè)作用域內(nèi)定義的函數(shù),它可以訪問(wèn)這個(gè)作用域內(nèi)的所有變量。
參考?http://blog.csdn.net/liangklfang/article/details/48543917
方法一、主動(dòng)設(shè)置js對(duì)象element為空,打破循環(huán)引用
function assignHandler()
{
? ?var element=document.getElementById("div1");
? ?var id=element.id;
? ?element.οnclick=function() //element的onclick引用了函數(shù)funciton,function通過(guò)閉包引用了element,照成循環(huán)引用
? ?{
? ? ? alert(id+element+sex);
? ? }
?/*閉包可以監(jiān)聽外部變量的變化,所以這里把element=null,也就是說(shuō)外部這個(gè)變量相當(dāng)于不存在了,雖然賦值是在閉包后面,閉包也能夠檢測(cè)到!所以匿名函數(shù)不會(huì)有外部的DOM對(duì)象的引用,不會(huì)內(nèi)存泄漏*/
? var sex="female";
? element=null;
}
?
方法二、通過(guò)添加另外一個(gè)閉包來(lái)避免JS對(duì)象和DOM對(duì)象之間的循環(huán)引用
?window.οnlοad=function outerFunction()
{
? var anotherObj=function innerFunction()
? ?{
? ? ? ? ? ? alert("I have avoided the leak!");
? ?}
//通過(guò)另外一個(gè)閉包來(lái)避免JS對(duì)象和DOM對(duì)象之間的循環(huán)引用
? function anotherInnerFunction()
? ?{
? ? ? ? var obj=document.getElementById("div1");
?//DOM對(duì)象引用了anotherObj函數(shù),但是anotherObj函數(shù)無(wú)法引用DOM對(duì)象
? ? ? ? obj.οnclick=anotherObj;
? };
? anotherInnerFunction();
}
方法三、通過(guò)添加另一個(gè)函數(shù)來(lái)避免閉包本身,進(jìn)而阻止內(nèi)存泄漏
window.οnlοad=function()
{
? ? ? ? var obj=document.getElementById("div1");
? ? ? ? obj.οnclick=doesNotLeak;
}
//該函數(shù)無(wú)法訪問(wèn)上面匿名函數(shù)中間的obj對(duì)象,從而可以阻止內(nèi)存泄漏!
function doesNotLeak()
{
? ?alert("我已經(jīng)阻止內(nèi)存泄漏了!");
}
7?解釋下浮動(dòng)和它的工作原理?清除浮動(dòng)的技巧
浮動(dòng)元素脫離文檔流,不占據(jù)空間。
1、<div style="clear:both;"></div>2、.clearfix:after?{content:".";?display:block;?height:0;?visibility:hidden;?clear:both;?}???
.clearfix?{?*zoom:1;?}?//為了適配ie6??
3,設(shè)置`overflow`為`hidden`或者auto
8 iframe iframe是一種框架,也是一種很常見的網(wǎng)頁(yè)嵌入方式,零度今天給大家分析分析它的優(yōu)缺點(diǎn)。
iframe的優(yōu)點(diǎn):
1.iframe能夠原封不動(dòng)的把嵌入的網(wǎng)頁(yè)展現(xiàn)出來(lái)。
2.如果有多個(gè)網(wǎng)頁(yè)引用iframe,那么你只需要修改iframe的內(nèi)容,就可以實(shí)現(xiàn)調(diào)用的每一個(gè)頁(yè)面內(nèi)容的更改,方便快捷。
3.網(wǎng)頁(yè)如果為了統(tǒng)一風(fēng)格,頭部和版本都是一樣的,就可以寫成一個(gè)頁(yè)面,用iframe來(lái)嵌套,可以增加代碼的可重用。
4.如果遇到加載緩慢的第三方內(nèi)容如圖標(biāo)和廣告,這些問(wèn)題可以由iframe來(lái)解決。
iframe的缺點(diǎn):
1.會(huì)產(chǎn)生很多頁(yè)面,不容易管理。
2.iframe框架結(jié)構(gòu)有時(shí)會(huì)讓人感到迷惑,如果框架個(gè)數(shù)多的話,可能會(huì)出現(xiàn)上下、左右滾動(dòng)條,會(huì)分散訪問(wèn)者的注意力,用戶體驗(yàn)度差。
3.代碼復(fù)雜,無(wú)法被一些搜索引擎索引到,這一點(diǎn)很關(guān)鍵,現(xiàn)在的搜索引擎爬蟲還不能很好的處理iframe中的內(nèi)容,所以使用iframe會(huì)不利于搜索引擎優(yōu)化。
4.很多的移動(dòng)設(shè)備(PDA 手機(jī))無(wú)法完全顯示框架,設(shè)備兼容性差。
5.iframe框架頁(yè)面會(huì)增加服務(wù)器的http請(qǐng)求,對(duì)于大型網(wǎng)站是不可取的。
分析了這么多,現(xiàn)在基本上都是用Ajax來(lái)代替iframe,所以iframe已經(jīng)漸漸的退出了前端開發(fā)。
求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
轉(zhuǎn)載于:https://www.cnblogs.com/y896926473/p/6651884.html
總結(jié)
- 上一篇: Shell语句
- 下一篇: iOS9https设置info.plis