無廢話JavaScript教程(全集)
更新時間:2008年10月07日 23:28:35 作者:
許多讀者認為我那本《JavaScript語言精髓與編程實踐》讀來辛苦,所以我一直想寫個簡單的讀本。索性,這次就寫個最簡單的吧。
http://www.blogjava.net/canonical/archive/2007/12/05/165664.html
延續(xù)是解決狀態(tài)問題的方法之一。簡單說來,有時間就有狀態(tài):有過去,現(xiàn)在和將來。對于過去,我們有歷史,也就會因為過去發(fā)生了什么而決定現(xiàn)在發(fā)生什么,例如因為昨天喝高了小酒,所以今天只能吃稀粥;而現(xiàn)在也就是明天的昨天,所以要為了明天能做什么而記錄下今天的狀態(tài),例如今天已經(jīng)吃了稀粥;至于明天,當然,將要發(fā)生的事情很多,我們得一件一件地做好準備。
Oh,重要的就是這個“做好準備”了。這在計算機系統(tǒng)里叫:事件?;蛘呓杏媱?,或者叫突發(fā)。知道為什么我們的PC機可以運行嗎?En...是因為有一個指令流水線在按照一個足夠微小的時間片去執(zhí)行指令。對于運算系統(tǒng)來說,這個定時發(fā)生的指令訪問行為,就是中斷。所以有一天一個朋友問我:如果執(zhí)行邏輯只有順序、分支與循環(huán),那么流程系統(tǒng)中的觸發(fā)器算什么?我想了很久,無解。而現(xiàn)在來回答這個問題,就得把“時間”這個維度加上,所謂突發(fā)、并發(fā)以及類似的東西,是時序概念下的邏輯。
好了,當我們“做好準備”,為了將來要觸發(fā)某個東西做準備的時候——簡單的說,就當是個時鐘處理程序好了(在windows中它叫OnTimer,在瀏覽器中它叫setTimeout/setInterval),為了這個時候我們能夠在函數(shù)式語言中做好一頓意大利面條,我們說明:“我們已經(jīng)做好了準備”,以及“我們做好了怎樣的準備”。而按照函數(shù)式的基本原則,一個函數(shù)是與狀態(tài)無關(guān)的,它與“將來”這樣一個時序無關(guān)。這,變成了一個矛盾。
事實上開始我們已經(jīng)與這個矛盾正面沖突了一次,這就是“循環(huán)”。因為循環(huán)需要一個狀態(tài)量來指示循環(huán)進度,
這個“進度”就是時序相關(guān)的。而函數(shù)式使用了“遞歸”來解決它,也就是通過遞歸函數(shù)的參數(shù)來傳遞這個進度。在“遞歸參數(shù)”——這個界面的兩邊,函數(shù)式都是時序無關(guān)的。由此帶來的問題就是棧溢出,解決方法則是尾遞歸;又由此帶來的問題就是編程復雜性,以及能否證明尾遞歸能替代所有遞歸;解決方案是……溫伯格說得沒錯,所有解決問題的方法都會帶來新的問題。Oh...又是溫伯格。 現(xiàn)在,我們明確的需要“更多的狀態(tài)”了,因為我們已經(jīng)將系統(tǒng)運行一個或是多個的時序里——也就CPU。即使我們有結(jié)點,而且保證“沒有蟲洞”,那么我們也需要解決一個CPU中的過去、現(xiàn)在與將來的問題。
函數(shù)式的仙家們說了兩個字:持續(xù)。簡單啊,就是把為過去、現(xiàn)在的狀態(tài),和為將來的準備作為函數(shù)的參數(shù)傳過去。看起來,“現(xiàn)在”立即就要爆炸了,因為既要包括過去的、現(xiàn)在的狀態(tài)以及變化,還要包括將來的運算。于是新的解決方案是:若要現(xiàn)在不爆炸,"持續(xù)"的界面上不要發(fā)生運算就好了。
運算由“將來”根據(jù)“過去”的數(shù)據(jù)做決策,這就是持續(xù)。支持它的函數(shù)式特性,就是在惰性求值。簡單的說,
function f(x, c) {
...
c(x);
}
f(data, f);
由于在傳送界面f()上,c本身是不求值的,所以爆炸會發(fā)生在/不會發(fā)生都是在將來c(x)進行運算的時候。如果
宇宙的熵有極限,那么這個極限也是在末可知的將來。而且,在末可知的將來,也有可能回扭曲回現(xiàn)在。這就是
持續(xù)的兩個原則:
--------------------
一個成功持續(xù)之后,是一個新的持續(xù)(或過程)
一個失敗持續(xù)將回到上一個選擇點
--------------------
正是因為有持續(xù)的狀態(tài),且這個狀態(tài)及持續(xù)本身都是通過函數(shù)參數(shù)傳遞的,所以,“回到選擇點”只是將來自身
的一個決擇,與現(xiàn)在的狀態(tài)是無關(guān)的。
七、更高級的函數(shù)式(2)
無論如何,種種函數(shù)式的復雜性,確實是在編程范型中保持一種自我的純粹性而存在的。例如生成器(產(chǎn)生器)
這個問題,由于一批數(shù)據(jù)的產(chǎn)生之間是有關(guān)系的(例如增量),而產(chǎn)生過程是時序相關(guān)的(不總是在一次調(diào)用中
得到全部的數(shù)據(jù)),因此函數(shù)式語言定義了一個“生成器”這樣的函數(shù)概念。我們可以在生成器中定義一個yield,
這個返回就是“將來”回到這個“現(xiàn)在”的一個蟲洞。通過這個蟲洞,我們可以拿到一個時序相關(guān)的數(shù)據(jù)。下面
就是這樣的一個例子(mozilla上的斐波那契數(shù)列示例):
<!-- for firefox 3 -->
<script type="application/javascript;version=1.7">
function fib() {
var i = 0, j = 1;
while (true) {
yield i; //<-蟲洞在這里
var t = i;
i = j;
j += t;
}
}
var g = fib();
a = g.next();
b = g.next();
c = g.next();
// ...
// .. 三天以后(或一個循環(huán)以后),某時空旅行家想回到fib里去看看
z = g.next();
// 呵,原來是值“2”
alert(z);
</script>
八、結(jié)語
好象,好象這篇《無廢話》有很多廢話……哈哈,玩笑啦,真的全無廢話,還是活人能看的木?
真的那么想讀無廢話,你應該去讀大學教材了?;蛘?,這里還有一本《JavaScirpt語言精髓與編程實踐》。
看見木,語言……精髓哦……,哈哈。
您可能感興趣的文章:
- JavaScript Break 和 Continue區(qū)別教程
- JavaScript入門教程(1) 什么是JS
- JavaScript 核心參考教程 內(nèi)置對象
- Aptana調(diào)試javascript圖解教程
- Javascript WebSocket使用實例介紹(簡明入門教程)
- javascript教程:關(guān)于if簡寫語句優(yōu)化的方法
- JavaScript基礎(chǔ)教程之a(chǎn)lert彈出提示框?qū)嵗?/a>
- JavaScript中的style.cssText使用教程
- JavaScript插件化開發(fā)教程 (一)
- JavaScript插件化開發(fā)教程 (二)
- Eclipse配置Javascript開發(fā)環(huán)境圖文教程
- javascript入門教程基礎(chǔ)篇
相關(guān)文章
javascript二維數(shù)組和對象的深拷貝與淺拷貝實例分析
這篇文章主要介紹了javascript二維數(shù)組和對象的深拷貝與淺拷貝,結(jié)合實例形式分析了JavaScript針對數(shù)組與對象的深拷貝及淺拷貝相關(guān)操作技巧,需要的朋友可以參考下2019-10-10JavaScript使用DeviceOne開發(fā)實戰(zhàn)(四)仿優(yōu)酷視頻應用
這篇文章主要介紹了JavaScript使用DeviceOne開發(fā)實戰(zhàn)(四)仿優(yōu)酷視頻應用的相關(guān)資料,需要的朋友可以參考下2015-12-12javascript封裝addLoadEvent實現(xiàn)頁面同時加載執(zhí)行多個函數(shù)的方法
這篇文章主要介紹了javascript封裝addLoadEvent實現(xiàn)頁面同時加載執(zhí)行多個函數(shù)的方法,實例分析了onload事件執(zhí)行的原理與同時執(zhí)行多個函數(shù)功能的實現(xiàn)技巧,需要的朋友可以參考下2016-07-07