最近看高程書,高級技巧那里講到了惰性載入函數(shù),經(jīng)過一天的搜索大致理解了,但是在搜索過程中發(fā)現(xiàn)了惰性求值這個術(shù)語,去維基百科上看,發(fā)現(xiàn)定義簡單概括如下:
當被需要的時候才去求值并且避免了重復(fù)求值。(核心思想:延遲處理)
從避免重復(fù)求值這點上,惰性載入函數(shù)應(yīng)該符合吧,但是當被需要的時候才去求值好像有點不大符合。
他倆到底是啥關(guān)系呢?
還有,惰性求值是不是需要用到閉包,那么閉包都是惰性求值嗎?
求大神們講解,在此多謝了!
我不知道你指的是不是那本12年出版的書。我的觀點是,這6年以來JavaScript已經(jīng)發(fā)生了翻天覆地的變化,12年的書不再適合當做教材,而應(yīng)該當做擴展書目,看完近幾年的資料后,有所取舍地閱讀。舉個例子,就“惰性載入函數(shù)”來說,對現(xiàn)代JavaScript引擎完全沒有必要:
function alwaysIf() {
if (document.attachEvent) {
return document.attachEvent;
}
else if(document.addEventListener) {
return document.addEventListener;
}
else {
return false;
}
}
function noIf() {
return document.addEventListener;
}
按照“惰性載入函數(shù)”的說法,alwaysIf應(yīng)該比noIf顯著地慢,因此我們需要用那種花里胡哨的手段替換掉alwaysIf里面的一大串if。事實呢?請看benchmark:https://jsbench.github.io/#27...
jsperf太麻煩了,不僅要填各種名字,還要FQ。
兩者的運行速度幾乎一樣。我用的是Chrome67。總之事實就是,現(xiàn)代JavaScript引擎的分支預(yù)測能力已經(jīng)相當變態(tài)了,沒有必要讓程序員多花精力實現(xiàn)那種別扭的東西。
我查到的維基百科惰性求值條目沒有任何“重復(fù)求值”的字樣。維基百科的定義是“在使用延遲求值的時候,表達式不在它被綁定到變量之后就立即求值,而是在該值被取用的時候求值 ”。維基百科
惰性載入函數(shù)符合“避免重復(fù)求值”,但的確不符合“被需要的時候才去求值”。惰性求值與惰性載入函數(shù)的關(guān)系?我看就是Java和JavaScript的關(guān)系。
JavaScript的普通變量沒有惰性求值的概念,所以惰性求值有時候會用函數(shù)實現(xiàn),而函數(shù)一般都是閉包。閉包可能是惰性求值,也可能不是。它們之間在概念上沒有任何聯(lián)系,只有在實現(xiàn)上可能有聯(lián)系。
最典型的惰性求值是生成器,跟閉包(在思路上)完全沒有關(guān)系:
function *gen() {
for(let i = 0; /* 死循環(huán) */ ; i++) {
yield i;
}
}
const g = gen(); // 綁定到變量之后沒有立即求值,沒有觸發(fā)死循環(huán)
g.next(); // 取用的時候求值: 1
有時候惰性求值是用函數(shù)實現(xiàn)的,而這個函數(shù)正好也是個閉包:
const a = 1;
const b = 2;
const lazy_add_a_b = () => a + b;
const sum = lazy_add_a_b; // 綁定到變量之后沒有立即求值,沒有計算a + b
sum(); // 取用的時候求值: 3
有時候惰性求值的函數(shù)是built-in,在里世界聲明,沒有詞法環(huán)境,那就不是閉包:
const lazy_print = console.log.bind(console, 1);
const p = lazy_print; // 綁定到變量之后沒有立即求值,沒有l(wèi)og
p(); // 取用的時候求值: 1
如果閉包立即執(zhí)行,那么也不是惰性求值:
const a = 1;
const b = 2;
const add_a_b = (() => a + b)(); // 已經(jīng)求值了,計算 add_a_b = a + b = 3
以上三個概念之間,沒有任何思路上的聯(lián)系。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。