柯里化(curring)的实际运用

发布于 2022-09-07 21:34:47 字数 1029 浏览 31 评论 0

题目描述

原文中,下列相关代码部分提现柯里化函数的 提前返回和延迟执行 两大特点,并且这样代码中只需要判断一次浏览器类型。我对于代码的理解在于,每次实际调用addEvent的时候,代码会进行一次函数执行,然后if(window.addEventListener) { ... } 这个内容还会进行一次浏览器判断。
感觉我的想法和作者的想法相悖了,所以我想问一下,为什么if(window.addEventListener)在实际应用中只执行一次。即使下次调用addEvent的时候,也不会进行浏览器判断

题目来源及自己的思路

这是我在掘金上看到的一个案例,代码在后面

作者:小兴nice
链接:https://juejin.im/post/5b8350...
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关代码

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);
            })
        }
    }
})()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

调妓 2022-09-14 21:34:47

这不是立即执行函数吗?只会在刚开始的时候运行一次,然后addEvent保存的是它的运行结果即返回的函数啊

空城之時有危險 2022-09-14 21:34:47

定义addEvent的时候,并立即执行了,执行一遍后,addEvent的执行函数就确定了。你是被返回的执行函数误导了,addEvent初始化后,就和原来的函数体没有关系了。你可以换个思路,把addEvent的返回函数改成返回一个对象,就好理解多了

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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文