首頁 web前端 js教程 深入解析Backbone.js框架的依賴函式庫Underscore.js的作用_基礎知識

深入解析Backbone.js框架的依賴函式庫Underscore.js的作用_基礎知識

May 16, 2016 pm 03:01 PM
backbone javascript js

backbone必須依賴underscore.js才能夠使用,它必須透過underscore中的函式來完成存取頁面元素、處理元素的基本操作。
註:backbone可以很好的與其它js庫一起工作,所以說它是一個庫,而不是框架。
Underscore並沒有對原生對象進行擴展,而是呼叫_()方法進行封裝,一旦封裝完成,js對象就變成Underscore對象,也可以透過Underscore對象的Value()方法取得原生js對像中的資料。 (jquery透過$()方法得到Jquery物件)
Underscore總共有60多個函數,依照處理物件的不同,可以分為集合類別、陣列類別、功能函數類別、物件類別、工具函數類別五大類模組。

underscore template()函數說明:

函數包含三種模板:

(1):包含邏輯程式碼,渲染後不會展現。
(2):資料類型,渲染後展示資料。
(3):將HTML標記轉換為常用字串,以避免程式碼攻擊。

呼叫格式:

_.template(templateString, [data], [setting])
登入後複製

沒有實現雙向資料綁定。

1、Underscore物件封裝
Underscore並沒有在原生的JavaScript物件原型中進行擴展,而是像jQuery一樣,將資料封裝在一個自訂物件中(下文稱為「Underscore物件」)。
你可以透過呼叫Underscore物件的value()方法來取得原生的JavaScript數據,例如:

// 定义一个JavaScript内置对象 
var jsData = { 
 name : 'data' 
} 
 
// 通过_()方法将对象创建为一个Underscore对象 
// underscoreData对象的原型中包含了Underscore中定义的所有方法,你可以任意使用 
var underscoreData = _(jsData); 
 
// 通过value方法获取原生数据, 即jsData 
underscoreData.value();
登入後複製

 2、優先呼叫JavaScript 1.6內建方法
Underscore中有許多方法在JavaScript1.6中已經被納入規範,因此在Underscore物件內部,會優先調用宿主環境提供的內建方法(如果宿主環境已經實現了這些方法),以此提高函數的執行效率。
而對於不支援JavaScript 1.6的宿主環境,Underscore會透過自己的方式實現,而對開發者來說,這些完全是透明的。
這裡所說的宿主環境,可能是Node.js運行環境,或是客戶端瀏覽器。

3、改命名空間
Underscore預設使用_(下劃線)來存取和建立對象,但這個名字可能不符合我們的命名規範,或容易引起命名衝突。
我們可以透過noConflict()方法來改變Underscore的命名,並恢復_(下劃線)變數之前的值,例如:

<script type="text/javascript"> 
 var _ = '自定义变量'; 
</script> 
<script type="text/javascript" src="underscore/underscore-min.js"></script> 
<script type="text/javascript"> 
 // Underscore对象 
 console.dir(_); 
 // 将Underscore对象重命名为us, 后面都通过us来访问和创建Underscore对象 
 var us = _.noConflict(); 
 // 输出"自定义变量" 
 console.dir(_); 
</script> 

登入後複製

4、鍊式操作
還記得我們在jQuery中是如何進行連結操作嗎?例如:

$('a') 
 .css('position', 'relative') 
 .attr('href', '#') 
 .show(); 

登入後複製

Underscore同樣支援鍊式操作,但你需要先呼叫chain()方法進行宣告:

var arr = [10, 20, 30]; 
_(arr) 
 .chain() 
 .map(function(item){ return item++; }) 
 .first() 
 .value(); 

登入後複製

如果呼叫了chain()方法,Underscore會將所呼叫的方法封裝在一個閉包內,並將傳回值封裝為Underscore物件並傳回:

// 这是Underscore中实现链式操作的关键函数,它将返回值封装为一个新的Underscore对象,并再次调用chain()方法,为方法链中的下一个函数提供支持。 
var result = function(obj, chain) { 
 return chain &#63; _(obj).chain() : obj; 
} 

登入後複製

5、擴充Underscore
我們可以透過mixin()方法輕鬆地在Underscore中擴展自訂方法,例如:

_.mixin({ 
 method1: function(object) { 
 // todo 
 }, 
 method2: function(arr) { 
 // todo 
 }, 
 method3: function(fn) { 
 // todo 
 } 
}); 
登入後複製

這些方法被追加到Underscore的原型物件中,所有創建的Underscore物件都可以使用這些方法,它們享有和其它方法同樣的環境。

6、遍歷集合
each()和map()方法是最常用用到的兩個方法,它們用於迭代一個集合(數組或物件),並依次處理集合中的每一個元素,例如:

var arr = [1, 2, 3]; 
 
_(arr).map(function(item, i) { 
 arr[i] = item + 1; 
}); 
 
var obj = { 
 first : 1, 
 second : 2 
} 
 
_(obj).each(function(value, key) { 
 return obj[key] = value + 1; 
}); 

登入後複製

map()方法与each()方法的作用、参数相同,但它会将每次迭代函数返回的结果记录到一个新的数组并返回。

7、函数节流
函数节流是指控制一个函数的执行频率或间隔(就像控制水流的闸门一样),Underscore提供了debounce()和throttle()两个方法用于函数节流。
为了更清楚地描述这两个方法,假设我们需要实现两个需求:

需求1:当用户在文本框输入搜索条件时,自动查询匹配的关键字并提示给用户(就像在Tmall输入搜索关键字时那样)
首先分析第1个需求,我们可以绑定文本框的keypress事件,当输入框内容发生变化时,查询匹配关键字并展示。假设我想查询“windows phone”,它包含13个字符,而我输入完成只花了1秒钟(好像有点快,就意思意思吧),那么在这1秒内,调用了13次查询方法。这是一件非常恐怖的事情,如果Tmall也这样实现,我担心它会不会在光棍节到来之前就挂掉了(当然,它并没有这么脆弱,但这绝对不是最好的方案)
更好的方法是,我们希望用户已经输入完成,或者正在等待提示(也许他懒得再输入后面的内容)的时候,再查询匹配关键字。
最后我们发现,在我们期望的这两种情况下,用户会暂时停止输入,于是我们决定在用户暂停输入200毫秒后再进行查询(如果用户在不断地输入内容,那么我们认为他可能很明确自己想要的关键字,所以等一等再提示他)
这时,利用Underscore中的debounce()函数,我们可以轻松实现这个需求:

<input type="text" id="search" name="search" /> 
<script type="text/javascript"> 
 var query = _(function() { 
 // 在这里进行查询操作 
 }).debounce(200); 
 
 $('#search').bind('keypress', query); 
</script> 

登入後複製

你能看到,我们的代码非常简洁,节流控制在debounce()方法中已经被实现,我们只告诉它当query函数在200毫秒内没有被调用过的话,就执行我们的查询操作,然后再将query函数绑定到输入框的keypress事件。
query函数是怎么来的?我们在调用debounce()方法时,会传递一个执行查询操作的函数和一个时间(毫秒数),debounce()方法会根据我们传递的时间对函数进行节流控制,并返回一个新的函数(即query函数),我们可以放心大胆地调用query函数,而debounce()方法会按要求帮我们做好控制。

需求2:当用户拖动浏览器滚动条时,调用服务器接口检查是否有新的内容
再来分析第2个需求,我们可以将查询方法绑定到window.onscroll事件,但这显然不是一个好的做法,因为用户拖动一次滚动条可能会触发几十次甚至上百次onscroll事件。
我们是否可以使用上面的debounce()方法来进行节流控制?当用户拖动滚动条完毕后,再查询新的内容?但这与需求不符,用户希望在拖动的过程中也能看到新内容的变化。
因此我们决定这样做:用户在拖动时,每两次查询的间隔不少于500毫秒,如果用户拖动了1秒钟,这可能会触发200次onscroll事件,但我们最多只进行2次查询。
利用Underscore中的throttle()方法,我们也可以轻松实现这个需求:

<script type="text/javascript"> 
 var query = _(function() { 
 // 在这里进行查询操作 
 }).throttle(500); 
 
 $(window).bind('scroll', query); 
</script> 

登入後複製

代码仍然十分简洁,因为在throttle()方法内部,已经为我们实现的所有控制。

你可能已经发现,debounce()和throttle()两个方法非常相似(包括调用方式和返回值),作用却又有不同。
它们都是用于函数节流,控制函数不被频繁地调用,节省客户端及服务器资源。
debounce()方法关注函数执行的间隔,即函数两次的调用时间不能小于指定时间。
throttle()方法更关注函数的执行频率,即在指定频率内函数只会被调用一次。
8、模板解析
Underscore提供了一个轻量级的模板解析函数,它可以帮助我们有效地组织页面结构和逻辑。
我将通过一个例子来介绍它:

<!-- 用于显示渲染后的标签 --> 
<ul id="element"></ul> 
 
<!-- 定义模板,将模板内容放到一个script标签中 --> 
<script type="text/template" id="tpl"> 
 <% for(var i = 0; i < list.length; i++) { %> 
 <% var item = list[i] %> 
 <li> 
  <span><%=item.firstName%> <%=item.lastName%></span> 
  <span><%-item.city%></span> 
 </li> 
 <% } %> 
</script> 
<script type="text/javascript" src="underscore/underscore-min.js"></script> 
<script type="text/javascript"> 
 // 获取渲染元素和模板内容 
 var element = $('#element'), 
 tpl = $('#tpl').html(); 
 
 // 创建数据, 这些数据可能是你从服务器获取的 
 var data = { 
 list: [ 
  {firstName: '<a href="#">Zhang</a>', lastName: 'San', city: 'Shanghai'}, 
  {firstName: 'Li', lastName: 'Si', city: '<a href="#">Beijing</a>'}, 
  {firstName: 'Wang', lastName: 'Wu', city: 'Guangzhou'}, 
  {firstName: 'Zhao', lastName: 'Liu', city: 'Shenzhen'} 
 ] 
 } 
 
 // 解析模板, 返回解析后的内容 
 var html = _.template(tpl, data); 
 // 将解析后的内容填充到渲染元素 
 element.html(html); 
</script> 
登入後複製

在本例中,我们将模板内容放到一个

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

建議:優秀JS開源人臉偵測辨識項目 建議:優秀JS開源人臉偵測辨識項目 Apr 03, 2024 am 11:55 AM

人臉偵測辨識技術已經是一個比較成熟且應用廣泛的技術。而目前最廣泛的網路應用語言非JS莫屬,在Web前端實現人臉偵測辨識相比後端的人臉辨識有優勢也有弱勢。優點包括減少網路互動、即時識別,大大縮短了使用者等待時間,提高了使用者體驗;弱勢是:受到模型大小限制,其中準確率也有限。如何在web端使用js實現人臉偵測呢?為了實現Web端人臉識別,需要熟悉相關的程式語言和技術,如JavaScript、HTML、CSS、WebRTC等。同時也需要掌握相關的電腦視覺和人工智慧技術。值得注意的是,由於Web端的計

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

股票分析必備工具:學習PHP和JS繪製蠟燭圖的步驟 股票分析必備工具:學習PHP和JS繪製蠟燭圖的步驟 Dec 17, 2023 pm 06:55 PM

股票分析必備工具:學習PHP和JS繪製蠟燭圖的步驟,需要具體程式碼範例隨著網路和科技的快速發展,股票交易已成為許多投資者的重要途徑之一。而股票分析是投資人決策的重要一環,其中蠟燭圖被廣泛應用於技術分析。學習如何使用PHP和JS繪製蠟燭圖將為投資者提供更多直觀的信息,幫助他們更好地做出決策。蠟燭圖是一種以蠟燭形狀來展示股票價格的技術圖表。它展示了股票價格的

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

PHP與JS開發技巧:掌握繪製股票蠟燭圖的方法 PHP與JS開發技巧:掌握繪製股票蠟燭圖的方法 Dec 18, 2023 pm 03:39 PM

隨著網路金融的快速發展,股票投資已經成為了越來越多人的選擇。而在股票交易中,蠟燭圖是常用的技術分析方法,它能夠顯示股票價格的變動趨勢,幫助投資人做出更精準的決策。本文將透過介紹PHP和JS的開發技巧,帶領讀者了解如何繪製股票蠟燭圖,並提供具體的程式碼範例。一、了解股票蠟燭圖在介紹如何繪製股票蠟燭圖之前,我們首先需要先了解什麼是蠟燭圖。蠟燭圖是由日本人

See all articles