接上篇函數返回
異常
try {
} catch(e) {
}
擴充類型的功能
有點像iOS中的分類
js允許給基本類型擴充功能。通過給Object的prototype添加方法,可以讓該方法對所有對象起作用。這種方式可以給所有對象類型,比如函數、數組、字符串、數字。還有布爾值也適用。
Function.prototype.method = fucntion (name, func) {
this.prototype[name] = func;
return this;
}
這種方式一般用于一些添加一些公用的方法。
作用域
作用與控制著變量與參數的可見性及生命周期,減少了名稱沖突以及提供自動內存管理。大多數語言和c一樣有塊級作用域。(在語句塊一對花括號內,定義的所有變量在代碼塊外是不可見的,定義到在塊中的變量會在代碼塊執行結束后釋放掉)
但是在js中雖然語法貌似支持塊級作用域,但是事實上是不支持的。js有函數作用域,意味著定義在函數中的參數對外部不可見,但是對函數內部任何地方都是可見的。
因為缺少塊級作用域,所以做好的做法就是在函數體頂部聲明所有可能用到的變量。
閉包
閉包就是能夠讀取其他函數內部變量的函數。
作用域的好處是可以訪問定義在外部的變量(除了this和arguments)。
內部函數擁有比他外部函數更長的作用域
var myObject = (function (){
var value = 0;
return {
increment: function (inc) {
value += typeof inc === 'number' ?inc : 1;
},
getValue: funtion () {
return value;
}
};
}());
函數返回一個包含兩個方法的對象,并且這些方法可以訪問value。
注意:理解內部函數能訪問外部函數的實際變量而無需復制是很重要
兩大作用:
- 一個可以讀取函數內部的變量,
- 另一個就是讓這些變量的值始終保持在內存中。
這部分知識比較多
回調
常見場景就是異步請求網絡中,為了防止假死狀態。相關操作在異步回調中完成。
沒有使用回調
request = prepare_the_request();
response = send_request_synchronously(request);
dispaly(response);
使用回調
send_request_asynchronously(request, function (response){
display(response);
});
模塊
模塊是一個提供接口但卻隱藏了狀態與實現的函數
或者對象
。可以通過函數或者閉包來構造模塊。通過函數產生模塊基本可以完全避免由于全局變量所帶來的糟糕的影響。
在javascript
中,Module
模式用于進一步模擬類的概念,通過這種方式,可以使一個單獨的對象擁有公有/私有方法和變量,從而屏蔽來自全局作用域的特殊部分。產生的結果是:函數名與在頁面上其他腳本定義的函數沖突的可能性降低。
Module模式使用閉包封裝”私有”狀態和組織。它提供了一種包裝混合公有/私有方法和變量的方式,防止其泄露至全局作用域,并與別的開發人員的接口發生沖突。通過該模式,只需返回一個公有API,而其他的一切都維持在私有閉包里面。
這樣做為我們提供了一個屏蔽處理底層事件邏輯的整潔解決方案,同時只暴露一個接口供應用程序的其他部分使用。該模式除了返回一個對象而不是一個函數之外,非常類似于一個立即調用的函數表達式(IIFE
)。
級聯
其實就是iOS中布局庫mansory的使用方式。這種方式有個比價牛逼的名字函數式編程
原理就是調用一個方法,方法返回值是this。然后有個一繼續調用另一個方法。形如:
getElement("MyBoxDiv")
.move(350, 150)
.width(100)
.height(100)
.padding("4px")
柯里化
名詞有點不懂:
柯里化是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,并且返回接收余下的參數而且返回結果的新函數的技術。
在js中函數也是值,柯里化允許把函數以及傳遞給函數的參數結合一下,產生一個新的函數。
var add1 = add.curry(1);
document.writeln(add1(6));// 7
記憶
函數可以將先前操作的結果記錄子啊某個對象里面,從而避免無謂的重復運算。這種優化為記憶。js中的對象和數組要實現這種優化非常方便。
常見寫法及時寫一個對象保存在,在調用的時候先判斷是否有值,如果有則跳過。
感覺這條并不是很有特別呀。為什么單獨列出來。