在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 惰性載入函數(shù)與惰性求值有關(guān)聯(lián)不?

惰性載入函數(shù)與惰性求值有關(guān)聯(lián)不?

最近看高程書,高級技巧那里講到了惰性載入函數(shù),經(jīng)過一天的搜索大致理解了,但是在搜索過程中發(fā)現(xiàn)了惰性求值這個術(shù)語,去維基百科上看,發(fā)現(xiàn)定義簡單概括如下:
當被需要的時候才去求值并且避免了重復(fù)求值。(核心思想:延遲處理)
從避免重復(fù)求值這點上,惰性載入函數(shù)應(yīng)該符合吧,但是當被需要的時候才去求值好像有點不大符合。
他倆到底是啥關(guān)系呢?
還有,惰性求值是不是需要用到閉包,那么閉包都是惰性求值嗎?
求大神們講解,在此多謝了!

回答
編輯回答
夢若殤

《高程書》與惰性載入函數(shù)

我不知道你指的是不是那本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...

benchmark

jsperf太麻煩了,不僅要填各種名字,還要FQ。

兩者的運行速度幾乎一樣。我用的是Chrome67。總之事實就是,現(xiàn)代JavaScript引擎的分支預(yù)測能力已經(jīng)相當變態(tài)了,沒有必要讓程序員多花精力實現(xiàn)那種別扭的東西。

惰性求值與“重復(fù)求值”

我查到的維基百科惰性求值條目沒有任何“重復(fù)求值”的字樣。維基百科的定義是“在使用延遲求值的時候,表達式不在它被綁定到變量之后就立即求值,而是在該值被取用的時候求值 ”。維基百科

惰性載入函數(shù)與“重復(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

總結(jié)

以上三個概念之間,沒有任何思路上的聯(lián)系。

2018年8月23日 10:41