zoukankan      html  css  js  c++  java
  • 函数——惰性函数

      惰性函数(Lazy Function): 惰性函数表示函数执行的分支只会在函数第一次调用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了。

      惰性函数的本质就是函数重写,所谓惰性载入,指函数执行的分支只会发生一次。那什么时函数重写呢?由于一个函数可以返回另一个函数,因此可以用新的函数在覆盖旧的函数。

        <script>
            function a() {
                console.log('a');
                a = function () {
                    console.log('b');
                }
            }
            a(); //q
            a(); //b
        </script>

      第一次调用这个函数时console.log('a')会被执行,打印出a,全局变量a被重定义并被赋予了新的函数,当再一次调用时,console.log('b')被执行。

      用处:因为各浏览器之间的行为差异,经常会在函数中包含了大量的if语句,以检查浏览器特性,解决不同浏览器的兼容问题。

        <script>
            function addEvent(type, element, fun) {
                if (element.addEventListener) {
                    element.addEventListener(type, fun, false);
                }
                else if (element.attachEvent) {
                    element.attachEvent('on' + type, fun);
                }
                else {
                    element['on' + type] = fun;
                }
            }
        </script>

      每次调用addEvent函数的时候,它都要对浏览器所支持的能力进行检查,首先检查是否支持addEventListener方法,如果不支持,再检查是否支持attachEvent方法,如果还不支持,就用dom0级的方法添加事件

      这个过程,在addEvent函数每次调用的时候都要走一遍,其实,如果浏览器支持其中的一种方法,那么它就会一直支持了,就没有必要再进行其他分支的检测了。也就是说,if语句不必每次都执行,代码可以运行的更快一些。

      惰性函数有两种实现方式:

        1、在函数被调用时,再处理函数。函数在第一次调用时,该函数会被覆盖为另外一个按合适方式执行的函数,这样任何对原函数的调用都不用再经过执行的分支了

        <script>
            function addEvent(type, element, fun) {
                if (element.addEventListener) {
                    addEvent = function (type, element, fun) {
                        element.addEventListener(type, fun, false);
                    }
                }
                else if (element.attachEvent) {
                    addEvent = function (type, element, fun) {
                        element.attachEvent('on' + type, fun);
                    }
                }
                else {
                    addEvent = function (type, element, fun) {
                        element['on' + type] = fun;
                    }
                }
                return addEvent(type, element, fun);
            }
        </script>

      在这个addEvent()中,if语句的每个分支都会为addEvent变量赋值,有效覆盖了原函数。最后一步便是调用了新赋函数。下一次调用addEvent()时,便会直接调用新赋值的函数,这样就不用再执行if语句了。

      2、声明函数时就指定适当的函数

        <script>
            var addEvent = (function () {
                if (document.addEventListener) {
                    return function (type, element, fun) {
                        element.addEventListener(type, fun, false);
                    }
                }
                else if (document.attachEvent) {
                    return function (type, element, fun) {
                        element.attachEvent('on' + type, fun);
                    }
                }
                else {
                    return function (type, element, fun) {
                        element['on' + type] = fun;
                    }
                }
            })();
        </script>
  • 相关阅读:
    c#中using System.Runtime.Serialization.Json;不能引用
    VS2013 当前不会命中断点还未为文档加载任何符号
    windows2008 设置会话超时时间
    服务没有及时响应启动或控制请求 1053
    IIS装好了无法访问localhost
    Shiro笔记——简介、 架构分析
    Java 连接使用 Redis
    Java 连接操作 Redis 出现错误
    网络方面的常用命令 & 常用端口介绍
    Redis 配置文件及命令详解
  • 原文地址:https://www.cnblogs.com/davina123/p/12024347.html
Copyright © 2011-2022 走看看