深入理解JavaScript系列(50):Function模式(下篇)
深入JavaScript系列(五十篇)——Function模式(下篇)
我们将继续深入JavaScript中的Function模式,尤其是那些用于初始化和性能优化的模式。如果您已经熟悉这些模式,欢迎再次回顾,相信这次的体验会有新的收获。
一、立即执行的函数
在之前的系列文章中,我们已经对立即执行的函数进行了详细的介绍。这类函数在声明后立刻执行,例如:
```javascript
// 声明后立刻执行的函数
(function () {
console.log('正在初始化...');
})();
```
我们还可以使用其他方式实现立即执行,如使用逻辑非运算符(!)、位运算符(~)、加运算符(-)等前缀:
```javascript
!function () {
console.log('正在初始化...');
}();
```
以上方式都可以达到立即执行函数的目的。
二、立即执行的对象初始化
除了函数,我们还可以在对对象进行声明时,立即执行对象中的某个方法进行初始化。这种模式通常用于一次性执行的代码。例如:
```javascript
({
// 定义常量或设置其他值
maxwidth: 600,
maxheight: ,
// 定义工具方法
gimmeMax: function () {
return this.maxwidth + "x" + this.maxheight;
},
// 初始化方法
init: function () {
console.log(this.gimmeMax()); // 输出最大尺寸,例如:600x
// 更多初始化代码...
}
})it(); // 这样就开始初始化了。
```
三、分支初始化模式
分支初始化是一种根据特定条件(场景)执行不同初始化代码的模式。这种模式在需要根据不同情况执行不同初始化逻辑时非常有用。例如:
```javascript
let condition = true; // 假设条件根据实际情况设定
let initFunction; // 初始化函数未定义之前暂存变量以待赋值。 如果没有满足条件的初始化函数就使用默认初始化。 根据条件的不同赋予不同的初始值或者初始逻辑。这样可以做到根据需求的不同来进行不同的初始化操作。大大提高了代码的复用性也增强了代码的健壮性。通过分支初始化,我们可以更加灵活地处理不同的初始化场景。在复杂的项目中,这种灵活性是非常重要的。理解并熟练运用这些模式,将大大提高你的JavaScript编程能力。希望这篇文章能给你带来启发和帮助。如果你有任何疑问或建议,欢迎在评论区留言交流。在我们处理事件的过程中,我们一直在使用类似于狼蚁网站SEO优化的代码来添加和移除事件监听器。为了更好地适应不同的浏览器和不同的使用场景,我们对代码进行了改进和优化。我们将原有的代码进行了重构,定义了两个接口:一个用于添加事件监听器,另一个用于移除事件监听器。这样的设计使得代码更加清晰、优雅,使用起来也更加方便。
重构后的代码如下所示:
我们初始化了一个包含两个属性的对象`utils`,这两个属性分别对应添加和移除事件监听器的函数,初始值设为`null`。
接着,我们根据浏览器的不同来分别实现这两个接口。如果浏览器支持`addEventListener`方法,我们就按照标准的DOM事件监听方式来实现;如果浏览器不支持`addEventListener`但支持`attachEvent`方法(如IE浏览器),我们就按照旧版IE浏览器的事件监听方式来实现;对于其他旧浏览器,我们则采用直接设置元素的事件属性来实现事件监听。
这样改进之后,我们可以根据不同的需求和环境灵活地选择使用哪种方式添加和移除事件监听器。由于代码更加简洁和优雅,也提高了代码的可读性和可维护性。现在,我们可以更加方便地使用这两个接口来处理各种事件,无需担心兼容性问题。无论是在现代浏览器还是旧版浏览器中,我们都可以轻松地添加和移除事件监听器,实现良好的交互体验。关于自声明函数与内存优化
当我们谈论函数时,自声明函数这一特殊形式常常令人费解但又充满魅力。让我们深入理解并其背后的原理。
代码如下:
var scareMe = function () {
alert("Boo!");
scareMe = function () {
alert("Double boo!");
};
};
```javascript
var myFunc = function (param) {
// 使用 hasOwnProperty 进行缓存检查
if (!myFunc.cache.hasOwnProperty(param)) {
var result = {}; // 执行复杂操作前的初始化或设置
// ... 复杂操作 ...
myFunc.cache[param] = result; // 将结果存入缓存
}
return myFunc.cache[param]; // 返回缓存中的结果或直接结果
};
// 初始化缓存存储
myFunc.cache = {};
```
```javascript
var myFunc = function () { // 使用 arguments 对象来接收所有参数
var cachekey = JSON.stringify(Array.prototype.slice.call(arguments)); // 将参数转化为字符串作为缓存键
var result; // 执行复杂操作前的初始化或设置
if (!myFunc.cache[cachekey]) { // 如果缓存中不存在该键
// ... 复杂操作 ...
myFunc.cache[cachekey] = result; // 将结果存入缓存
}
return myFunc.cache[cachekey]; // 返回缓存中的结果或直接结果
};
// 初始化缓存存储
myFunc.cache = {};
```
```javascript
var myFunc = function (param) { // 定义函数并使用 arguments.callee 来访问自身
var f = arguments.callee; // 获取当前函数的引用
var result; // 执行复杂操作前的初始化或设置
if (!f.cache[param]) { // 如果函数缓存中不存在该键
// ... 复杂操作 ...
f.cache[param] = result; // 将结果存入函数缓存中
}
return f.cache[param]; // 返回缓存中的结果或直接结果
};
f.cache = {}; // 为函数添加缓存属性并初始化,注意这里的 f 是 myFunc 的引用,而非 myFunc 的调用实例。所以不需要在每个实例上创建新的 cache 属性。使用这种方式可以确保所有的调用共享同一个缓存对象。但是要注意使用 arguments.callee 是有争议的,因为某些严格的JavaScript环境可能不支持这个特性。在现代的开发环境中可能已经不再推荐使用此方法了。这种方法也可能导致一些问题比如遮蔽全局变量等问题需要特别注意和使用避免风险问题发生。最后确保不要在全局范围内声明多个具有相同名称的函数否则会出现混淆和覆盖的问题。此外这种方式由于可能引发一些问题在现代前端开发中逐渐被淘汰和废弃所以一般不推荐使用这种方式进行函数缓存的处理。因此在实际开发中我们通常会选择使用第一种或者第二种方式进行函数缓存的处理以提高代码的稳定性和可维护性。
seo排名培训
- 深入理解JavaScript系列(50):Function模式(下篇)
- javascript显示上周、上个月日期的处理方法
- jfinal与bootstrap的登出实战详解
- 【经典源码收藏】基于jQuery的项目常见函数封装
- 深入浅析Vue.js计算属性和侦听器
- 自己封装的常用javascript函数分享
- Javascript 调用 ActionScript 的简单方法
- 通过设置CSS中的position属性来固定层的位置
- PHP实现的数据对象映射模式详解
- Nodejs学习笔记之入门篇
- ASP.NET使用xslt将xml转换成Excel
- 微信小程序模拟cookie的实现
- 深入理解JavaScript中的块级作用域、私有变量与模
- 基于vue-cli vue-router搭建底部导航栏移动前端项目
- JQuery 又谈ajax局部刷新
- ES6 Promise对象的含义和基本用法分析