2017面試題1

AMD 和 CMD 的區別有哪些?javascript

區別:前端

1. 對於依賴的模塊,AMD 是提早執行,CMD 是延遲執行。不過 RequireJS 從 2.0 開始,也改爲能夠延遲執行(根據寫法不一樣,處理方式不一樣)。CMD 推崇 as lazy as possible.java

2. CMD 推崇依賴就近,AMD 推崇依賴前置。看代碼:angularjs

// 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

 

MVC,MVP 和 MVVM框架

mvc 

  1. View 傳送指令到 Controller
  2. Controller 完成業務邏輯後,要求 Model 改變狀態
  3. 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 引用計數法,跟蹤記錄每一個值的被引用次數。

 

JS中Null與Undefined的區別

在JavaScript中存在這樣兩種原始類型:Null與Undefined。

Undefined類型只有一個值,即undefined。當聲明的變量還未被初始化時,變量的默認值爲undefined。
Null類型也只有一個值,即null。null用來表示還沒有存在的對象,經常使用來表示函數企圖返回一個不存在的對象。

 7 閉包是什麼?閉包如何避免內存循環引用。

閉包是在某個做用域內定義的函數,它能夠訪問這個做用域內的全部變量。

參考 http://blog.csdn.net/liangklfang/article/details/48543917

方法1、主動設置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;

}

 

方法2、經過添加另一個閉包來避免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();
}

方法3、經過添加另外一個函數來避免閉包自己,進而阻止內存泄漏

window.onload=function()
{
        var obj=document.getElementById("div1");
        obj.onclick=doesNotLeak;
}
//該函數沒法訪問上面匿名函數中間的obj對象,從而能夠阻止內存泄漏!
function doesNotLeak()
{
   alert("我已經阻止內存泄漏了!");
}

7 解釋下浮動和它的工做原理?清除浮動的技巧

浮動元素脫離文檔流,不佔據空間。

一、<div style="clear:both;"></div>

二、.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 =1var y = 0var z = 0function add(n){n=n+1}y=add(x)function add(n){n=n+3}z=add(x)underfined 
相關文章
相關標籤/搜索