注:本文中部分描述都是操作我的书《JavaScript高级应用与实践》而言,还请朋友们多多支持我的书,详情请见:
博主网站地址:
http://m9m.3322.org/doc/js/md00.jsp
“北京电子工业出版社”地址
http://www.phei.com.cn/bookshop/bookinfo.asp?bookcode=TP061230%20&booktype=main
其实,“链式闭包模式”在第2章2.1节中的D部分已经描述,本节就其原理进行通用化的封装。它将为你解决团队开发中多人编写不同的onload函数并进行一次串联执行的问题,同时为你解决多继承扩展中的种种问题——在下一节中你会看到“链式闭包模式”在其中的应用。
所谓的“链式”,是指调用一个对象的方法后返回的是这个对象自身,也就是返回this,因此可以进行链式调用。所谓“闭包”是指由于JavaScript中的变量没有像Java、C++那样的块作用域(块通常用{}包含起来),而只有function范围的作用域,再加上函数中的匿名函数赋予一个函数之外的变量,也就是函数之外有变量(也叫句柄、指针)引用了函数内部定义的匿名函数,这时候当这个变量没有被delete或赋予null,则调用这个函数时,JavaScript的虚拟机会保留和这个匿名函数同级的所有变量,直到这个引用句柄被销毁(指向匿名对象的链接被断开),这些function作用域的变量才得以清除。具体请看下面的设计。
// 封装:链式闭包模式
function linkClosedMode()
{
var _this = this;
// 仅仅起到function引用对象占位的作用
// 以便start中第一次调用的时候不至于对无效的function进行调用
_this.start = function(){return _this;};
// 请参阅第2章2.1节D中"闭包链式模式"
_this.add = fnPrivateFunc(func)
{
var oLstFunc = _this.start;
_this.start = function()
{
// 用apply(this, arguments),使得start的所有参数带入链路中的所有函数
oLstFunc.apply(this, arguments);
func.apply(this, arguments);
// 当若不加下面的3行,则创建的linkClosedMode实例调用start后,如果在调用add
// 函数加入其他的方法,再次执行start的时候,会把之前的一并执行
// ——下面3行代码的目的:使得linkClosedMode实例调用start后成为以讹干净的对象
delete oLstFunc;
delete _this.start;
_this.start = function(){};
};
return _this;
};
for(var i = 0, j = arguments.length; i < j; i++)
_this.add(arguments[i]);
return this;
}
// 使用: 这些被add的方法能正确获得start调用的时候传入的所有参数
new linkClosedMode().add(function()
{
alert("加入的第一个方法,参数:" + Array.apply(null, arguments));
}).add(function()
{
alert("加入的第二个方法,参数:" + Array.apply(null, arguments));
}).add(function()
{
alert("加入的第三个方法,参数:" + Array.apply(null, arguments));
}).start("参数1", 324,55);
// 或者:
new linkClosedMode(function()
{
alert("加入的第1个方法,参数:" + Array.apply(null, arguments));
},function()
{
alert("加入的第2个方法,参数:" + Array.apply(null, arguments));
},function()
{
alert("加入的第3个方法,参数:" + Array.apply(null, arguments));
}).start(10000, 99);
分享到:
相关推荐
JavaScript中的链式调用是一种常见的编程技巧,尤其在处理对象属性和方法时,可以使代码更加简洁、易读。链式调用的核心思想是通过在每次方法调用后返回对象自身,使得可以连续调用多个方法而无需重复指定对象名。在...
由于JavaScript中只有函数内部的子函数才能读取局部变量,因此闭包可以被看作是“定义在一个函数内部的函数”。 闭包的作用之一是可以从外部读取一个函数内部的变量。这可以通过在外部函数中定义一个内嵌函数,并将...
链式调用在JavaScript语言中很常见,如jQuery、Promise等,都是使用的链式调用,当我们在调用同一对象多次其属性或方法的时候,我们需要多次书写对象进行.或()操作,链式调用是一种简化此过程的一种编码方式,使代码...
【JavaScript 闭包详解】 闭包是JavaScript编程中一个核心且...理解闭包对于深入掌握JavaScript至关重要,因为它在许多高级编程技巧和模式中扮演着重要角色。通过实践和研究,初学者将逐渐领悟闭包的魅力和实用性。
JavaScript中的`return`关键字和闭包是编程中两个非常重要的概念,它们对于理解和编写高效、模块化的代码至关重要。 首先,让我们来深入理解`return`的关键字。`return`的主要功能是在函数执行过程中结束函数的执行...
在JavaScript中,每个函数都有自己的作用域链,它们可以向上查找父函数的变量,这就是所谓的“链式作用域”结构。因此,父函数的变量在其内部定义的子函数中都是可见的。 闭包的概念可以理解为,在一个函数内部定义...
JavaScript是Web开发中的核心语言,其重要特性包括同步与异步处理、作用域与闭包、以及原型和原型链。这些概念是理解JS高级特性的基石。 **同步与异步的区别** 在JavaScript中,同步执行意味着代码按照顺序依次运行...
本教程《最好的javascript学习教程-JavaScript使用详解》涵盖了以上所有内容,通过阅读和实践,你将能够熟练掌握JavaScript,并运用到实际的Web开发中去。无论你是初学者还是经验丰富的开发者,都能从中受益匪浅。
3.2 闭包:详解闭包的概念,理解作用域链和闭包如何保持变量的状态。 第四讲:面向对象编程 4.1 类与继承:学习ES6中的class语法和原型继承机制,以及如何实现多态性。 4.2 构造函数与实例:掌握实例化过程,了解...
在JavaScript编程中,闭包是一个非常重要的概念,它是一种特殊的对象,它允许一个函数访问并操作函数外部的变量。要理解闭包,我们先要明确一些基础知识点: 1. **变量作用域**:在JavaScript中变量有全局变量和...
### JavaScript性能优化技巧详解 #### 引言 随着Web应用的日益复杂,JavaScript作为前端开发的核心语言之一,其运行效率直接影响着用户体验与整体性能。因此,掌握一定的JavaScript性能优化技巧对于提升应用程序...
JavaScript是一种广泛应用于...以上是JavaScript的一些基本技巧和用法,通过不断实践和学习,你可以掌握更多的高级概念和框架,如闭包、原型链、模块系统、Promise、async/await等,进一步提升你的JavaScript编程技能。
### JavaScript 使用教程涉及的知识点详解 #### 一、JavaScript 概述 JavaScript 是一种轻量级的编程语言,被广泛用于网页开发中实现交互性功能。它是一种解释型语言,通常由浏览器内置的JavaScript引擎执行。...
Javascript闭包(Closure)详解 Javascript闭包(Closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。下面是对闭包的详细解释。 一、变量的作用域 要理解闭包,首先必须理解...
在 JavaScript 中,通常使用闭包来实现单例模式。 **示例代码:** ```javascript const Singleton = (function () { let instance; function createInstance() { return { someMethod: function () {} }; } ...
首先,全局对象(Global Object)是JavaScript环境中最初创建的对象,它包含了JavaScript内置的函数和对象,如Math、String、Date等。同时,全局对象还有一个名为`window`的属性,它指向全局对象自身,使得我们可以...
在JavaScript中,可以通过闭包或构造函数来实现封装。 ##### 4. 多态 多态是指同一个行为可以有不同的实现方式,即不同的对象可以以自己的方式响应同一消息。JavaScript通过鸭子类型(duck typing)等技术实现多态...
### JavaScript设计模式详解 #### 面向对象基础 在JavaScript中实现面向对象编程(OOP)是提升代码质量和可维护性的关键。OOP的核心概念包括封装、继承和多态。 - **封装**: 封装是一种将数据和操作数据的方法捆绑...