鍍金池/ 問答/網(wǎng)絡(luò)安全  HTML/ 柯里化(curring)的實(shí)際運(yùn)用

柯里化(curring)的實(shí)際運(yùn)用

題目描述

原文中,下列相關(guān)代碼部分提現(xiàn)柯里化函數(shù)的 提前返回和延遲執(zhí)行 兩大特點(diǎn),并且這樣代碼中只需要判斷一次瀏覽器類型。我對于代碼的理解在于,每次實(shí)際調(diào)用addEvent的時候,代碼會進(jìn)行一次函數(shù)執(zhí)行,然后if(window.addEventListener) { ... } 這個內(nèi)容還會進(jìn)行一次瀏覽器判斷。
感覺我的想法和作者的想法相悖了,所以我想問一下,為什么if(window.addEventListener)在實(shí)際應(yīng)用中只執(zhí)行一次。即使下次調(diào)用addEvent的時候,也不會進(jìn)行瀏覽器判斷

題目來源及自己的思路

這是我在掘金上看到的一個案例,代碼在后面

作者:小興nice
鏈接:https://juejin.im/post/5b8350...
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

相關(guān)代碼

var addEvent = (function() {
    if(window.addEventListener) {  // 只判斷一次瀏覽器類型
        return function(el, type, fn, capture) {
            el.addEventListener(type, function(e) {
                fn.call(el, e);
            }, capture);
        }
    }else {
        return function(ele, type, fn) {
            el.attachEvent('on' + type, function(e) {
                fn.call(el, e);
            })
        }
    }
})()

回答
編輯回答
貓小柒

定義addEvent的時候,并立即執(zhí)行了,執(zhí)行一遍后,addEvent的執(zhí)行函數(shù)就確定了。你是被返回的執(zhí)行函數(shù)誤導(dǎo)了,addEvent初始化后,就和原來的函數(shù)體沒有關(guān)系了。你可以換個思路,把a(bǔ)ddEvent的返回函數(shù)改成返回一個對象,就好理解多了

var obj = (function(){
      console.log('init')
      if(window.addEventListener){
        return {
          func:window.addEventListener
        }
      } else {
        return {
          func:window.attachEvent
        }
      }
    })()

    console.log(obj.func)
    console.log(obj.func)
    console.log(obj.func)
2018年7月16日 08:21
編輯回答
離夢

這不是立即執(zhí)行函數(shù)嗎?只會在剛開始的時候運(yùn)行一次,然后addEvent保存的是它的運(yùn)行結(jié)果即返回的函數(shù)啊

2017年11月8日 12:05