匿名函数就是没有名字的函数,有时候也称为拉姆达(lambda)函数。
//函数声明
function functionName(){
}
//函数表达式
var functionName = function(arg0,arg1,arg2){
}
/*
*区别:
*1函数声明会在代码执行以前被加载到作用域 会指定一个名字
*2函数表达式在代码执行到那一行的时候才会有定义 创建一个匿名函数。赋给变量
*/
7.1 递归
递归函数是在一个函数通过名字调用自身的情况下构成的。
arguments.callee是一个指向正在执行的函数的指针,可以实现函数的递归调用
function factorial(num){
if (num <= 1){
return 1;
} else {
return num * factorial(num-1);
}
}
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4)); //error!
//在编写递归函数时,用arguments.callee比用函数名保险
function factorial(num){
if (num <= 1){
return 1;
} else {
return num * arguments.callee(num-1);
}
}
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4)); //24
7.2 闭包
闭包是指有权访问另一个函数作用域中的变量的函数。
创建闭包的常见方式,就是在一个函数内部创建另一个函数。
function f1(){
var n = 999;
nAdd = function(){
n+=1;
}
function f2(){
alert(n);
}
return f2;
}
var result = f1();
result();
nAdd();
result();
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());
7.2.1闭包与变量
闭包所保存的是整个变量对象,不是某个特殊的变量。
7.2.2 this对象
this对象是在运行时基于函数的执行环境绑定的。
在全局函数中,this等于window。
当函数被作为某个对象的方法调用时,this等于那个对象。
匿名函数的执行环境具有全局性,this指window
7.2.3内存泄露
如果闭包的作用域链中保存着一个html元素,该元素无法被销毁。必须设为null。
function assignHandler(){
var element = document.getElementById("elementId");
var id = element.id;//element.id保存在变量id中
element.onclick = function(){
alert(id); //在闭包中引用该变量消除循环引用
};
element = nul; //将element设为null
}
7.3 模仿块级作用域
匿名函数可以用来模仿块级作用域(私有作用域)
(funciton(){
//这里是块级作用域
})();
无论在什么地方,只要临时需要一些变量,就可以使用私有作用域。
通过创建私有作用域,每个开发人员既可以使用自己的变量,又不必担心搞乱全局作用域。
这种做法可以减少闭包占用的内存问题。
7.4 私有变量
js没有私有成员的概念,所有对象都是公有的。
任何在函数中定义的变量,都可以认为是私有变量,因为不能再函数的外部访问这些变量。
私有变量包括函数的参数,局部变量和在函数中定义的其他函数。
特权方法: 有权访问私有变量和私有函数的公有方法。
2种创建特权方法的方式。
1 在构造函数中定义特权方法。
function Person(name){
this.getName = function(){
return name;
};
this.setName = function(value){
name = value;
};
}
var person = new Person("flyer");
alert(person.getName());
person.setName("bird");
alert(person.getName());
缺点:必须使用构造函数来达到目的。构造函数模式缺点是针对每个实例都会创建同样一组新方法。使用静态私有变量可以避免。
7.4.1 静态私有变量
(function(){
var name = "";
Person = function(value){
name = value;
};
Person.prototype.getName = function(){
return name;
};
Person.prototype.setName = function (value){
name = value;
};
})();
var person = new Person("flyer");
alert(person.getName());
person.setName("bird");
alert(person.getName());
7.4.2 模块模式
道格拉斯所说的模块模式是为单例创建私有变量和特权方法,所为单例,指只有一个实例的对象。
javascript是以对象字面量来创建单例的。
var singleton(){
name: value,
method: function(){
//这里是方法的代码
}
}
模块模式通过为单例添加私有变量和特权方法使其增强:
var singleton = function(){ //返回对象的匿名函数。
//私有变量和私有函数
var privateVariable = 10;
function privateFunction(){
return false;
}
//特权/公有方法和属性
return {
publicProperty: true,
publicMethod: function(){
privateVariable++;
return privateFunction();
}
};
}();
7.4.3 增强的模块模式
适合那些单例必须是某种类型的实例,同事还必须添加某些属性和方法对其加以增强的情况。
function BaseComponent(){
}
function OtherComponent(){
}
var application = function(){
//私有变量和函数
var components = new Array();
//初始化
components.push(new BaseComponent());
//创建application的一个局部副本
var app = new BaseComponent();
//公共接口
app.getComponentCount = function(){
return components.length;
};
app.registerComponent = function(component){
if (typeof component == "object"){
components.push(component);
}
};
//返回这个副本
return app;
}();
alert(application instanceof BaseComponent);
application.registerComponent(new OtherComponent());
alert(application.getComponentCount()); //2
分享到:
相关推荐
这份“JavaScript练习程序学习笔记”很可能包含了一系列的代码示例、学习心得和常见问题解答,旨在帮助学习者深入理解和掌握JavaScript编程。 在JavaScript的学习过程中,首先会接触到基础语法,包括变量声明(var...
1. Lambda表达式与LINQ:Lambda表达式是匿名函数的简洁表示,广泛应用于LINQ(Language Integrated Query),使得在C#中进行数据库查询和其他集合操作更加方便。 2. 属性与事件:属性提供了一种访问类成员的受控...
《李炎恢JS笔记》是一份详实且深入的JavaScript学习资料,主要涵盖了JavaScript高级程序设计的核心概念和技术。这份笔记以其精炼而全面的内容,深受希望快速掌握JavaScript编程的学者们的喜爱。以下将对其中涉及的...
第三种是函数直接量,也称为匿名函数,可以作为表达式的一部分直接定义和使用。 在HTML文档对象模型(DOM)中,节点是构成网页结构的基本元素。主要有三种类型的节点:文本节点,存储HTML文档中的文本内容;属性...
Java JDK 6学习笔记PPT版是一份专为初学者设计的教育资源,旨在全面解析Java编程语言的基础知识。这份资料基于J2SDK1.6,也就是我们常说的JDK1.6或JDK6.0,它包含了Java开发工具集的重要更新和改进。JDK6.0是Oracle...
IIFE(Immediately Invoked Function Expression)是一种立即执行的匿名函数表达式,它可以创建一个作用域,让模块内的变量和函数不会被外部访问。 4. **放大模式** - 当模块较大或需要模块继承时,可以使用放大...
1. **Lambda表达式**:Java 1.8中最重要的特性之一,它允许开发者以简洁的方式定义匿名函数,大大简化了对集合的操作和事件处理。Lambda表达式具有函数类型、参数列表和主体,可以用来替代只有单个抽象方法的接口...
- **递归**:递归是一种算法或程序设计技巧,在函数或过程中调用自身来解决问题的方法。递归的关键在于设置好递归的基本情况(base case)和递归规则。 - **集合、范型、自动打包解包、Annotation**:集合框架提供了...
基础概念包括变量(`var`, `let`, `const`)、数据类型(如字符串、数字、布尔值、对象等)、条件语句(`if...else`、`switch`)、循环(`for`, `while`)、函数(声明式和匿名函数)以及面向对象编程(类和实例)。...
JavaScript还支持匿名函数和箭头函数。 5. **数组**:数组是存储多个值的数据结构,可以使用方法(如push、pop、forEach)进行操作。 6. **对象**:JavaScript的对象是键值对的集合,可以通过属性和方法进行操作。 7...
`,lambda表达式提供了更简洁的语法来定义匿名函数,用于查询和数据处理。 #### 邮箱验证与自定义扩展方法 Visual Studio 2008中,可以方便地实现邮箱地址的有效性验证,例如: ```csharp if (EmailValidator.Is...
Lambda表达式是函数式编程中的关键元素,它代表了一个匿名函数,即没有名字的函数,通常用于将函数作为参数传递给其他函数,或者作为返回值返回。在很多现代编程语言中,如Java 8、Python、JavaScript等,Lambda...
它不仅是一个个人的学习笔记,也是一个共享的资源库,帮助其他开发者解决问题或找到灵感。下面,我们将深入探讨这个项目可能包含的一些核心JavaScript概念和应用。 1. **变量与数据类型**:JavaScript是动态类型的...
【表白墙微信小程序项目】是由刘胜制作的一款基于JavaScript技术的微信...通过深入研究并理解loveWall-master中的源代码,开发者可以学习到微信小程序的开发流程、API使用、数据管理以及用户体验设计等多个方面的知识。
7. **动态类型**:C# 4.0引入了动态类型,允许在运行时确定变量的具体类型,便于与非.NET框架库(如JavaScript或Python库)进行交互。 8. **委托与事件**:C#中的委托类似于函数指针,可以将方法作为参数传递,常...
在深入探讨Kotlin编程语言之前,先要明白“정정정리”在韩语中的含义,这可能是作者对整理和修正学习笔记的表述。Kotlin是一种现代、静态类型的编程语言,由JetBrains公司开发,主要用于Android应用开发,但也适用于...
在这个名为"MyBook"的项目中,我们很可能看到一个基于Java 8的开源系统,它可能是作者个人的学习笔记、代码示例或者一个实际的应用程序。下面将详细探讨Java 8的关键特性,以及它们在实际开发中的应用。 1. **...