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