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?
接受用戶指令時,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.ο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、<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
轉載于:https://www.cnblogs.com/y896926473/p/6651884.html
總結
- 上一篇: Shell语句
- 下一篇: iOS9https设置info.plis