碼農(第12期)
圖靈社區
jQuery提供了一系列選擇器用於選取界面元素,在其他一些框架中也有類似功能,但是一般沒有它的簡潔、強大。$("*") // 選取所有元素
$("#lastname") // 選取id爲lastname 的元素 $(".intro") // 選取所有class="intro"的元素
$("p") // 選取所有<p> 元素 $(".intro.demo") // 選取所有class="intro" 且class="demo"的元素
鏈式表達式:在jQuery中,可以使用鏈式表達式來連續操作dom,比如下面這個例子:
如果不使用鏈式表達式,可能我們需要這麼寫:var neat = $("p.neat");
neat.addClass("ohmy"); neat.show("slow");
但是有了鏈式表達式,我們只需要這麼一行代碼就可以完成這些:$("p.neat").addClass("ohmy").show("slow");
除此之外,jQuery還提供了一些動畫方面的特效代碼,也有大量的外圍庫,比如jQuery UI這樣的控件庫,jQuery mobile這樣的移動開發庫等等。
在這些框架裏,知名度比較高的是RequireJS,它遵循一種稱爲AMD(Asynchronous Module Definition)的規範。
如何更好地模塊化開發業務數據如何組織
界面和業務數據之間通過何種方式進行交互在這種背景下,出現了一些前端MVC、MVP、MVVM框架,我們把這些框架統稱爲MV*框架。這些框架的出現,都是爲了解決上面這些問題
JavaScript使用2種不同的等值運算符:===|!==和==|!=,在比較操作中使用前者是最佳實踐。“如果兩邊的操作數具有相同的類型和值,===返回true,!==返回false。”
——JavaScript:語言精粹然而,當使用==和!=時,你可能會遇到類型不同的情況,這種情況下,操作數的類型會被強制轉換成一樣的再做比較,這可能不是你想要的結果。
“JSLint掃面輸入的源代碼。如果發現一個問題,它返回一條描述問題和一個代碼中的所在位置的消息。問題並不一定是語法錯誤,儘管通常是這樣。JSLint還會查看一些編碼風格和程序結構問題。這並不能保證你的程序是正確的。它只是提供了另一雙幫助發現問題的眼睛。”——JSLing文檔
部署腳本之前,運行JSLint,只是爲了確保你沒有做出任何愚蠢的錯誤。
在本系列前面的文章裏已經提到過這個技巧,我粘貼信息在這裏。記住——首要目標是讓頁面儘可能快的呈獻給用戶,腳本的夾在是阻塞的,腳本加載並執行完之前,瀏覽器不能繼續渲染下面的內容。因此,用戶將被迫等待更長時間。
如果你的js只是用來增強效果——例如,按鈕的單擊事件——馬上將腳本放在body結束之前。這絕對是最佳實踐。
當你需要遍歷數組或對象的時候,不要總想着“for”語句,要有創造性,總能找到更好的辦法,例如,像下面這樣。var arr = ['item 1', 'item 2', 'item 3', ...];
var list = '<ul><li>' + arr.join('</li><li>') + '</li></ul>';我不是你心中神,但請你相信我(不信你自己測試)——這是迄今爲止最快的方法!使用原生代碼(如 join()),不管系統內部做了什麼,通常比非原生快很多。
——James Padolsey, james.padolsey.com
只要把多個全局變量都整理在一個名稱空間下,擬將顯著降低與其他應用程序、組件或類庫之間產生糟糕的相互影響的可能性。——Douglas Crockford
var name = 'Jeffrey'; var lastName = 'Way';
function doSomething() {...}
console.log(name); // Jeffrey -- 或 window.name更好的做法
var DudeNameSpace = { name : 'Jeffrey',
lastName : 'Way', doSomething : function() {...}
} console.log(DudeNameSpace.name); // Jeffrey
在JavaScript中創建對象的方法有多種。可能是傳統的方法是使用"new"加構造函數,像下面這樣:var o = new Object();
o.name = 'Jeffrey'; o.lastName = 'Way';
o.someFunction = function() { console.log(this.name);
}然而,這種方法的受到的詬病不及實際上多。作爲代替,我建議你使用更健壯的對象字面量方法。
更好的做法var o = {
name: 'Jeffrey', lastName = 'Way',
someFunction : function() { console.log(this.name);
} };
注意,如果你只是想創建一個空對象,{}更好。var o = {};
“對象字面量使我們能夠編寫更具特色的代碼,而且相對簡單的多。不需要直接調用構造函數或維持傳遞給函數的參數的正確順序,等
這同樣適用於創建一個新的數組。例如:
var a = new Array(); a[0] = "Joe";
a[1] = 'Plumber';更好的做法:
var a = ['Joe','Plumber'];“javascript程序中常見的錯誤是在需要對象的時候使用數組,而需要數組的時候卻使用對象。規則很簡單:當屬性名是連續的整數時,你應該使用數組。否則,請使用對象”
——Douglas Crockford
var someItem = 'some string'; var anotherItem = 'another string';
var oneMoreItem = 'one more string';更好的做法
var someItem = 'some string', anotherItem = 'another string',
oneMoreItem = 'one more string';…應而不言自明。我懷疑這裏真的有所提速,但它能是你的代碼更清晰。
當遍歷對象的屬性時,你可能會發現還會檢索方法函數。爲了解決這個問題,總在你的代碼裏包裹在一個if語句來過濾信息。for(key in object) {
if(object.hasOwnProperty(key) { ...then do something...
} }
參考JavaScript:語言精粹,道格拉斯(Douglas Crockford)。
在尋找一個快速、簡單的方法來確定操作需要多長時間嗎?使用Firebug的“timer”功能來記錄結果。function TimeTracker(){
console.time("MyTimer"); for(x=5000; x > 0; x--){}
console.timeEnd("MyTimer");
和調用一個函數類似,它很簡單的使一個函數在頁面加載或父函數被調用時自動運行。簡單的將你的函數用圓括號包裹起來,然後添加一個額外的設置,這本質上就是調用函數。(function doSomething() {
return { name: 'jeff',
lastName: 'way' };
})()
路由:把變化通過瀏覽器URL的參數反映出來,並監聽這些變化以便執行相應的操作。視圖綁定:在視圖中使用可觀察對象,讓視圖隨着可觀察對象的變化而自動刷新。
雙向綁定:讓視圖也能把變化(如表單輸入)自動推送到可觀察對象。部分視圖:包含其他視圖的視圖。
篩選列表視圖:用於顯示根據某些條件篩選出來的對象的視圖。
多看筆記 來自多看閱讀 for Android