惰性

改掉拖延
本文作者反思了自身存在的拖延问题,并决心做出改变。计划首先克服拖延习惯,其次实现以往未能达成的目标。
部署运行你感兴趣的模型镜像

管不住自己,做事总喜欢拖延,有通宵的习惯,做正事时总 爱东扯西拉扯淡去了.

第一个要改正的就是这个缺点了

第二个要完成以前的目标,很多想做的但没做的,今年希望能完成

 

思考+计划+行动=?成功

您可能感兴趣的与本文相关的镜像

Qwen3-8B

Qwen3-8B

文本生成
Qwen3

Qwen3 是 Qwen 系列中的最新一代大型语言模型,提供了一整套密集型和专家混合(MoE)模型。基于广泛的训练,Qwen3 在推理、指令执行、代理能力和多语言支持方面取得了突破性进展

<think>我们正在分析的是惰性函数(Lazy Function)的概念,并以用户提供的addEvent函数为例。 惰性函数的原理:在函数内部重写函数自身,以便在第一次调用时根据条件分支选择最优的实现,后续调用直接使用优化后的函数,避免重复的条件判断。 结合用户提供的代码: function addEvent(el, type, handler) { if (window.addEventListener) { addEvent = function(el, type, handler) { // 重写addEvent为现代浏览器的版本 el.addEventListener(type, handler, false); } } else { addEvent = function(el, type, handler) { // 重写addEvent为IE的版本 el.attachEvent('on' + type, handler); } } // 调用新函数 return addEvent(el, type, handler); } 分析: 1. 第一次调用addEvent时,会执行条件判断,检查window.addEventListener是否存在。 2. 根据判断结果,将addEvent重新定义为一个具体的函数(适配现代浏览器或IE)。 3. 然后立即使用新的函数定义来执行当前的事件绑定。 4. 此后,每次调用addEvent都是调用重写后的函数,不再进行条件判断。 惰性函数的优势: - 避免了每次调用都进行条件检测,提高了后续调用的性能。 - 特别适用于需要多次调用的函数,且执行环境不会改变的情况(比如浏览器环境在页面加载后是固定的)。 应用场景: 1. 浏览器特性检测(如事件绑定、XMLHttpRequest创建等)。 2. 根据运行环境初始化适配函数。 但注意:惰性函数只会在第一次执行时进行判断,如果环境在后续发生变化(比如浏览器动态升级?这在实际中很少见),则可能失效。所以惰性函数适用于环境固定的场景。 对比引用[1]中的写法: 引用[1]中的写法每次调用都会进行条件判断。而惰性函数只在第一次判断,后续调用直接使用优化后的函数。 引用[1]的写法: const addEvent = function(el, type, handler) { if (window.addEventListener) { return el.addEventListener(type, handler, false) } if (window.attachEvent) { return el.attachEvent(`on${type}`, handler) } } 惰性函数的优化点:避免了重复的条件判断。 注意事项: 1. 惰性函数在第一次调用时完成了函数自身的重写,因此第一次调用会执行两次函数(一次条件判断和重写,一次实际调用)。 2. 在重写函数时,要确保新函数与原始函数的参数和返回值保持一致。 扩展:惰性函数的另一种写法是在函数声明时就进行分支判断(立即执行函数),这样第一次调用就是优化后的函数,但会稍微增加初始化的开销。 例如: var addEvent = (function() { if (window.addEventListener) { return function(el, type, handler) { el.addEventListener(type, handler, false); }; } else { return function(el, type, handler) { el.attachEvent('on' + type, handler); }; } })(); 这种写法在脚本加载时就完成了条件检测,而不是在第一次调用时。适用于函数可能被多次调用且我们希望避免第一次调用两次执行的情况。 总结:惰性函数是一种优化技巧,用于避免重复的条件判断,尤其适用于函数会被频繁调用且条件分支在运行期间不会改变的场景。 生成相关问题: 1. 惰性函数与立即执行函数在性能优化上有何异同? 2. 除了事件绑定,惰性函数还有哪些典型应用场景? 3. 惰性函数在第一次调用时执行两次,如何避免这种额外的开销? 4. 如何在模块化开发中应用惰性函数? </think>### JavaScript惰性函数分析与原理 #### 一、惰性函数基本原理 惰性函数(Lazy Function)是一种**运行时优化技术**,核心特点是通过**动态重写函数自身**来避免重复的条件判断。其数学表示为: $$ f(x) = \begin{cases} g(x) & \text{条件 } A \\ h(x) & \text{条件 } \neg A \end{cases} $$ 首次执行后,函数会被永久重写为最优实现: $$ f \leftarrow \begin{cases} g & \text{首次满足 } A \\ h & \text{首次满足 } \neg A \end{cases} $$ #### 二、示例代码分析 ```javascript function addEvent(el, type, handler) { // 首次执行:浏览器能力检测 if (window.addEventListener) { // 重写为现代API实现 addEvent = function(el, type, handler) { el.addEventListener(type, handler, false); } } else { // 重写为IE兼容实现 addEvent = function(el, type, handler) { el.attachEvent('on' + type, handler); } } // 调用新函数并返回结果 return addEvent(el, type, handler); } ``` 1. **首次执行阶段** - 检测`window.addEventListener`存在性 - 根据结果**重写`addEvent`函数自身** - 立即调用新函数完成事件绑定 2. **后续执行阶段** - 直接使用重写后的函数(`addEventListener`或`attachEvent`) - **跳过浏览器检测**(性能优化的关键) - 时间复杂度从$O(1)$降为$O(0)$(无分支判断)[^1] #### 三、技术优势 | 优化维度 | 传统实现[^1] | 惰性函数实现 | |----------------|-------------------------------|------------------------| | 执行效率 | 每次调用都需检测 | 仅首次检测 | | 内存占用 | 条件分支始终存在 | 重写后无冗余代码 | | 可维护性 | 需手动管理兼容性 | 自动适配最优实现 | | 调用开销 | $O(n)$(n为调用次数) | $O(1)$(首次后为$O(0)$)| #### 四、典型应用场景 1. **浏览器特性检测** ```javascript function getXMLHttpRequest() { if (window.XMLHttpRequest) { getXMLHttpRequest = () => new XMLHttpRequest(); } else { getXMLHttpRequest = () => new ActiveXObject("Microsoft.XMLHTTP"); } return getXMLHttpRequest(); } ``` 2. **性能敏感操作** ```javascript // 节流函数优化(引用[3]) function throttle(fn, delay) { if (window.requestAnimationFrame) { throttle = (fn, delay) => {...} // RAF实现 } else { throttle = (fn, delay) => {...} // setTimeout实现 } return throttle(fn, delay); } ``` 3. **复杂计算初始化** ```javascript // 函数柯里化优化(引用[4]) function curry(fn) { if (Function.prototype.bind) { curry = (fn) => {...} // 使用原生bind } else { curry = (fn) => {...} // 手动实现柯里化 } return curry(fn); } ``` #### 五、注意事项 1. **不可逆重写** 环境变化后无法自动恢复(如页面加载后动态升级浏览器) 2. **调试复杂度** 函数签名变化可能导致调试困难(需关注首次执行) 3. **内存管理** 重写前的闭包引用需谨慎处理(避免内存泄漏)[^3] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值