前端开发者进阶之惰性函数定义

深入解析MTK DRM初始化流程:从KMS模块到组件框架 本文深入解析了联发科(MTK)平台上DRM显示框架的初始化流程。从内核模块加载、Component框架管理依赖,到核心的mtk_drm_bind函数构建KMS对象(CRTC、Plane、Encoder、Connector),最终完成DRM设备注册并创建用户空间接口。文章结合调试经验,为开发者梳理了从驱动启动到屏幕点亮的完整路径与关键排查点。 阅读详情

前端开发者进阶之惰性函数定义

穆乙:http://www.cnblogs.com/pigtail/p/3447660.html 

函数是js世界的一等公民,js的动态性、易变性在函数的应用上,体现的淋漓尽致。做为参数,做为返回值等,正是函数这些特性,使得js开发变的有趣。

下面就阐述一下,js一个有趣的应用--惰性函数定义(Lazy Function Definition)。

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

下面我们看几个典型的例子:

复制代码
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;
    }
}
复制代码

上面是注册函数监听的各浏览器兼容函数。由于,各浏览之间的差异,不得不在用的时候做能力检测。显然,单从功能上讲,已经做到了兼容浏览器。美中不足,每次绑定监听,都会对能力做一次检测。然而,真正的应用中,这显然是多余的,同一个应用环境中,其实只需要检测一次即可。

下面我们重写上面的addEvent:

复制代码
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);
}
复制代码

由上,第一次调用addEvent会对浏览器做能力检测,然后,重写了addEvent。下次再调用的时候,由于函数被重写,不会再做能力检测。

同样的应用,javascript高级程序设计里的一例子:

复制代码
function createXHR(){
    if (typeof XMLHttpRequest != "undefined"){
        return new XMLHttpRequest();
    } else if (typeof ActiveXObject != "undefined"){
        if (typeof arguments.callee.activeXString != "string"){
            var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0",
                            "MSXML2.XMLHttp"];
    
            for (var i=0,len=versions.length; i < len; i++){
                try {
                    var xhr = new ActiveXObject(versions[i]);
                    arguments.callee.activeXString = versions[i];
                    return xhr;
                } catch (ex){
                    //skip
                }
            }
        }
    
        return new ActiveXObject(arguments.callee.activeXString);
    } else {
        throw new Error("No XHR object available.");
    }
}
复制代码

很显然,惰性函数在这里优势更加明显,因为这里有更多的分支。下面我们看一下重写后台的函数:

复制代码
function createXHR() {
            if (typeof XMLHttpRequest != "undefined") {
                createXHR = function () {
                    return new XMLHttpRequest();
                }
                return new XMLHttpRequest();
            } else if (typeof ActiveXObject != "undefined") {
                var curxhr;
                var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0",
                    "MSXML2.XMLHttp"];

                for (var i = 0, len = versions.length; i < len; i++) {
                    try {
                        var xhr = new ActiveXObject(versions[i]);
                        curxhr = versions[i];
                        createXHR = function () {
                            return new ActiveXObject(curxhr);
                        }
                        return xhr;
                    } catch (ex) {
                        //skip
                    }
                }
            } else {
                throw new Error("No XHR object available.");
            }
        }
复制代码

 

浏览器之间最大的差异,莫过于Dom操作,Dom操作也是前端应用 中最频繁的操作,前端的大多性能提升,均体现在Dom操作方面。下面看一个Dom操作方面的惰性函数定义例子:

复制代码
var getScrollY = function() {

    if (typeof window.pageYOffset == 'number') {

        getScrollY = function() {
            return window.pageYOffset;
        };

    } else if ((typeof document.compatMode == 'string') &&
               (document.compatMode.indexOf('CSS') >= 0) &&
               (document.documentElement) &&
               (typeof document.documentElement.scrollTop == 'number')) {

        getScrollY = function() {
            return document.documentElement.scrollTop;
        };

    } else if ((document.body) &&
               (typeof document.body.scrollTop == 'number')) {

      getScrollY = function() {
          return document.body.scrollTop;
      }

    } else {

      getScrollY = function() {
          return NaN;
      };

    }

    return getScrollY();
}
复制代码

 惰性函数定义应用还体现在创建单例上:

复制代码
unction Universe() {

    // 缓存的实例
    var instance = this;

    // 其它内容
    this.start_time = 0;
    this.bang = "Big";

    // 重写构造函数
    Universe = function () {
        return instance;
    };
}
复制代码

当然,像上面这种例子有很多。惰性函数定义,应用场景我们可以总结一下:

1 应用频繁,如果只用一次,是体现不出它的优点出来的,用的次数越多,越能体现这种模式的优势所在;

2 固定不变,一次判定,在固定的应用环境中不会发生改变;

3 复杂的分支判断,没有差异性,不需要应用这种模式;

 

AI写作:为AI人工智能领域赋能 AI写作技术作为自然语言处理(NLP)领域的重要应用方向,正在深刻改变内容创作的方式。系统介绍AI写作的技术原理分析主流AI写作模型的架构特点提供实践性的代码示例探讨实际应用中的关键问题展望未来发展趋势本文涵盖从基础理论到高级应用的完整知识体系,适用于希望深入了解AI写作技术的开发者和研究人员。背景介绍:建立基本概念框架核心概念:解析关键技术原理算法实现:通过代码演示具体实现数学原理:深入底层数学模型实践应用:展示真实场景案例资源推荐:提供学习路径和工具。 阅读详情

相关推荐

拯救者R7000P(2021)装双系统Ubuntu20.04 解决联发科MT7921无线网卡在Ubuntu中不能联网

拯救者R7000P(2021)装双系统Ubuntu20.04/Ubuntu18.04 电脑配置:联想拯救者R7000P CPU:AMD R7-5800H GPU:RTX3060-6G 内存:16GB 固态:500G(原装)+500(加装) 1.做系统盘(本文以Ubuntu20.04为例) 1.下载Ubuntu20.04镜像 直接去Ubuntu官网或者一些国内的镜像去下载都可以,这里给出一个网址https://ubuntu.com/download/desktop,根据需要下载自己学要的Ubuntu版本,后缀

qq_41108639的博客 1万+

惰性函数(函数重写)

主要讲解惰性函数的定义以及写法

weixin_48602044的博客 623

论文Agile Autonomy: Learning High-Speed Flight in the Wild开源代码运行记录

​ Agile Autonomy: Learning High-Speed Flight in the Wild Learning High-Speed Flight in the Wild 论文链接:https://www.science.org/doi/10.1126/scirobotics.abg5810 代码:https://github.com/uzh-rpg/agile_autonomy 国内复现:https://github.com/Howardcl/AgileAutonomyPX4

Hanamizukimr的博客 1489

Python3学习(15)--惰性函数

Python的函数太丰富了,讲起来稍微有点费劲,如果给你一个函数简单使用的话,你大可不必深入去了解这个函数,但是作为一个学习者来说尽管不知道以后这个函数我们还会不会遇到,会不会使用到,我们也要尝试去和它打交道,深入的打交道,尽自己所理解的,去阐述它; 上一篇我们简单的配置了wing开发IDE,这篇,我们就结合一下它,来讲一下我们今天的主角,惰性函数,又称返回函数; 函数,我们知道它可以

Appleyk的专栏 1万+

DeepSeek-OCR 本地部署使用教程(附完整环境配置与推理示例)

DeepSeek-OCR是由DeepSeek AI推出的开源OCR模型,支持高精度文档识别与结构化输出(如Markdown转换)。本文提供了详细的本地部署指南,包括系统要求(推荐Linux+A100 GPU)、环境配置(Python 3.12.9+PyTorch 2.6.0+CUDA 11.8)、模型下载及两种推理方式:高性能的vLLM(适合批量处理)和灵活的Transformers(适合调试)。支持多种分辨率模式和提示词模板,适用于合同识别、PDF转换等场景。常见问题包括显存优化和性能调优建议。

qq_58607032的博客 6723

manimgl安装

安装manimgl

happytree001的博客 707

惰性函数的用法

惰性函数是一种设计模式,主要用于延迟计算某些复杂对象的创建,直到这些对象实际需要使用时才进行创建。这样可以提高性能,因为一些不常用的功能不会在脚本加载时立即执行,从而减少资源消耗。

qq_43893277的博客 378

基于STM32、HAL库的 CH9102X USB转UART收发器 驱动程序设计

/ 或 UART_HWCONTROL_RTS_CTS。// 其他函数实现类似,使用HAL_UART_Transmit_IT, HAL_UART_Receive_IT等。UART_TXD <---> USARTx_RX (STM32接收)UART_RXD <---> USARTx_TX (STM32发送)* @param huart: UART句柄指针。* @param huart: UART句柄指针。* @param huart: UART句柄指针。* @param huart: UART句柄指针。

corlin6688的博客 506

深入理解立即调用函数表达式(IIFE)

在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法也不一定完全对,每个人对他的理解都不一样,我们在这里用立即调用~顾名思义,该表达式一被创建就立即执行。是一个在定义时就会立即执行的 JavaScript 函数。第一部分是包围在 圆括号运算符 () 里的一个匿名函数,这个匿名函数拥有独立的词法作用域。这不仅避免了外界访问此 IIFE 中的变量,而且又不会污染全局作用域。第二部分再一次使用 () 创建了一个立即执行函数表达式,JavaScript 引擎到此将直接执行函数。

xxx割喉的博客 342

使用cmd命令查看电脑是不是翻新机 如何查看自己电脑是不是翻新机

最近pdd啥的百亿补贴啊,什么品牌店啊,很多“假一赔十”,绝对“正品”都蹦出来了,很多人拿到以后,也上网查了各种鉴别方式,包括区分是不是翻新机之类的。本人亲自踩坑“pdd品牌店”,“假一赔十”,“绝对正品”等店铺,跟大家分享一下我得鉴别经验(说道分享鉴别经验了,大家也就不用好奇了,我肯定是买到翻新机了,mmp)。 第一步:准备好手机,开始录屏,没有完整的拆箱视频,可能不容易退货退款 第二步:拆箱,查看屏幕划痕(用手机闪光灯看,要不然看不清),然后查看屏幕有没有被擦过的痕迹 第三步:查看USB孔等插口有没有划

weixin_39417324的博客 1万+

btstack ble ota开发笔记(2)-mcuboot移植

紧接上一篇文章,要实现一个完整的ota demo,除了实现ota image的传输通道外,还需要“bootloader”这个角色来帮我们实现ota image的校验、安全、引导以及启动,这里我选择开源的组件mcuboot,下面开始介绍mcuboot在stm32f4-discovery上的移植。首先估算下bootloader & application image的大小,确定好flash的分布情况,因为后续会涉及到flash的操作(读、写、擦除),为了方便程序的编写,各个image area在flash中的起

weixin_38177846的博客 2350

JS惰性函数:优化性能的前端编程技巧

惰性函数是JavaScript中一种高效的编程模式,通过函数在首次执行时动态重写自身实现,避免重复的条件判断。这种技术特别适用于浏览器特性检测、环境判断等场景,能显著提升代码执行效率。在前端开发中,惰性函数常被用于优化事件监听、AJAX请求等高频操作,相比传统条件判断方式可带来数倍的性能提升。其核心原理类似于缓存机制,但实现更加优雅,既能保持代码简洁性,又能实现运行时优化。理解惰性函数的工作原理和实现方式,对于编写高性能的前端代码具有重要意义。

weixin_29708043的博客 6

Cursor使用教程:用 Cursor 创建第一个 Java 项目

Cursor是一款基于VS Code的AI编程编辑器,专为开发者设计。安装前需确保JDK 8+、Maven 3.8+等环境配置,支持Windows系统。编辑器提供中文界面选项,可通过扩展市场安装语言包。创建Java项目支持手动和AI提示词两种方式:手动需创建目录结构并编写代码;AI方式则通过自然语言描述快速生成项目框架和代码。标准Java项目包含src/main/java主代码目录、src/test/java测试目录及pom.xml等配置文件。Maven项目中,pom.xml是核心配置文件,管理项目依赖与构

博客 3548

JavaScript节流和防抖函数与及使用分时函数惰性函数优化性能

一、节流函数 1. 使用场景 DOM.onclick()事件,我们给一个DOM节点绑定了点击事件,当点击该元素时触发事件函数的执行,但是当我们频繁点击该元素时,就会不断触发该点击事件,如果该点击事件触发的事件函数是DOM元素的,就会造成很高的性能消耗,可能会造成页面的卡顿。 所以此时我们应该限制该事件的触发频率,减少页面的开销。 2. 原理 连续触发事件,但是事件函数只在在规定的周期之内只执行一次...

weixin_43534005的博客 238

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

什么是惰性载入函数?

惰性载入函数(Lazy Loading Function)是前端开发中的一种优化技术,旨在提升页面性能、减少不必要的计算和提高代码执行效率。这种技术主要应用在JavaScript编程中,特别是在处理浏览器兼容性问题时尤为有用。综上所述,惰性载入函数是前端开发中一种有效的性能优化技术,它能够帮助开发者在处理浏览器兼容性问题、减少不必要计算和提升页面响应速度方面取得显著成果。

王铁柱666的博客 401

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

(立下flag)每日10道前端面试题-15 关于【高级技巧】十问

解决的方案称之为惰性载入。有两种实现惰性载入的方式,第一种事函数在第一次调用时,对函数本身进行二次处理,该函数会被覆盖为符合分支条件的函数,这样对原函数的调用就不用再经过执行的分支了,我们可以用下面的方式使用惰性载入重写addEvent()。这个例子中使用的技巧是创建一个匿名的自执行函数,通过不同的分支以确定应该使用那个函数实现,实际的逻辑都一样,不一样的地方就是使用了函数表达式(使用了var定义函数)和新增了一个匿名函数,另外每个分支都返回一个正确的函数,并立即将其赋值给变量addEvent。

2401_84139676的博客 859

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

python中生成器的惰性机制

学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

2401_83641360的博客 426

transducers.js惰性计算详解:提升前端应用响应速度的秘密

transducers.js是一个受Clojure transducers启发的小型数据转换库,它通过创新的惰性计算机制,帮助开发者构建高效、响应迅速的前端应用。本文将深入探讨transducers.js的核心原理,展示如何利用其惰性计算特性优化数据处理流程,显著提升应用性能。 ## 什么是惰性计算?为什么它很重要? 惰性计算(Lazy Evaluation)是一种按需计算的策略,只有当真正需

gitblog_00054的博客 601

[JavaScript]ES6的函数拓展,无偿分享

ES6函数拓展。

2401_84091993的博客 880

python中生成器的惰性机制(1)

学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

2401_83641314的博客 387

[JavaScript]ES6的函数拓展

ES6函数拓展。

qinglp的博客 694

10个前端冷门但好用的前端工具函数库

本文系统介绍了10个专业前端工具函数库,涵盖通用工具、函数式编程、动画、随机数、SQL查询、地理位置、URL构建、日期处理和CSS工具等核心领域。这些库各具特色:fns.js提供全面的通用功能,utils-lite专注于轻量化,fn-lib擅长函数式编程,tween-functions处理专业动画,random-utils生成随机数据,query-builder构建SQL查询,geo-location处理地理位置,url-builder管理URL,date-utils处理复杂日期,css-utils优化CS

油墨香^-^的博客 674

前端进阶必备

函数柯里化的是一个为多参函数实现递归降解的方式。其实现的核心是: 要思考如何缓存每一次传入的参数 传入的参数和目标函数的入参做比较 这里通过闭包的方式缓存参数,实现如下: 使用方式如下: 函数柯里化仅仅只是上面求和的这种运用吗?? ????这个问题,有必要去????一下。其实利用函数柯里化这种思想,我们可以更好的实现函数的封装。 就比如有监听某一事件那么就会有移除该事件的操作,那么就可以利用柯里化的思想去封装代码了。 或者说一个输入 A 有唯一并且对应的输出 B,那么从

qq_34703156的博客 211

wu.js与生成器函数的完美结合:编写优雅的惰性计算代码

在JavaScript开发中,处理大数据集合时性能优化一直是个挑战。**wu.js** 作为一款专为ES6迭代器设计的高阶函数库,通过与**生成器函数**的完美结合,为我们提供了一种编写**优雅惰性计算代码**的全新方式。无论你是前端开发者还是Node.js工程师,掌握wu.js都能让你的数据处理代码更加高效和简洁。 ## 🔥 为什么需要wu.js和惰性计算? 传统JavaScript数组操

gitblog_01084的博客 387
上一篇: Array.prototype.slice.call(arguments)
下一篇: spket插件的安装与使用完整图文版
DDPJS
博客等级 码龄17年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值