`
bird12010
  • 浏览: 8087 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

《javascript高级程序设计2》学习笔记7 匿名函数

阅读更多

匿名函数就是没有名字的函数,有时候也称为拉姆达(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练习程序学习笔记.rar

    这份“JavaScript练习程序学习笔记”很可能包含了一系列的代码示例、学习心得和常见问题解答,旨在帮助学习者深入理解和掌握JavaScript编程。 在JavaScript的学习过程中,首先会接触到基础语法,包括变量声明(var...

    经典、简单C#学习笔记

    1. Lambda表达式与LINQ:Lambda表达式是匿名函数的简洁表示,广泛应用于LINQ(Language Integrated Query),使得在C#中进行数据库查询和其他集合操作更加方便。 2. 属性与事件:属性提供了一种访问类成员的受控...

    李炎恢js笔记

    《李炎恢JS笔记》是一份详实且深入的JavaScript学习资料,主要涵盖了JavaScript高级程序设计的核心概念和技术。这份笔记以其精炼而全面的内容,深受希望快速掌握JavaScript编程的学者们的喜爱。以下将对其中涉及的...

    javaWeb学习笔记.doc

    第三种是函数直接量,也称为匿名函数,可以作为表达式的一部分直接定义和使用。 在HTML文档对象模型(DOM)中,节点是构成网页结构的基本元素。主要有三种类型的节点:文本节点,存储HTML文档中的文本内容;属性...

    Java JDK 6学习笔记PPT版

    Java JDK 6学习笔记PPT版是一份专为初学者设计的教育资源,旨在全面解析Java编程语言的基础知识。这份资料基于J2SDK1.6,也就是我们常说的JDK1.6或JDK6.0,它包含了Java开发工具集的重要更新和改进。JDK6.0是Oracle...

    JavaScript 模块化编程(笔记)

    IIFE(Immediately Invoked Function Expression)是一种立即执行的匿名函数表达式,它可以创建一个作用域,让模块内的变量和函数不会被外部访问。 4. **放大模式** - 当模块较大或需要模块继承时,可以使用放大...

    java1.8纯手打笔记,老师讲义,囊括1.8版本下所有java知识点

    1. **Lambda表达式**:Java 1.8中最重要的特性之一,它允许开发者以简洁的方式定义匿名函数,大大简化了对集合的操作和事件处理。Lambda表达式具有函数类型、参数列表和主体,可以用来替代只有单个抽象方法的接口...

    java知识点汇总学习路线与笔记

    - **递归**:递归是一种算法或程序设计技巧,在函数或过程中调用自身来解决问题的方法。递归的关键在于设置好递归的基本情况(base case)和递归规则。 - **集合、范型、自动打包解包、Annotation**:集合框架提供了...

    前端开发笔记.docx

    基础概念包括变量(`var`, `let`, `const`)、数据类型(如字符串、数字、布尔值、对象等)、条件语句(`if...else`、`switch`)、循环(`for`, `while`)、函数(声明式和匿名函数)以及面向对象编程(类和实例)。...

    Learning-[removed]我对网络JavaScript的了解

    JavaScript还支持匿名函数和箭头函数。 5. **数组**:数组是存储多个值的数据结构,可以使用方法(如push、pop、forEach)进行操作。 6. **对象**:JavaScript的对象是键值对的集合,可以通过属性和方法进行操作。 7...

    Visual Studio 2008新特性-笔记

    `,lambda表达式提供了更简洁的语法来定义匿名函数,用于查询和数据处理。 #### 邮箱验证与自定义扩展方法 Visual Studio 2008中,可以方便地实现邮箱地址的有效性验证,例如: ```csharp if (EmailValidator.Is...

    lambda-talks:布拉格 Lambda 聚会过去会谈的笔记和链接

    Lambda表达式是函数式编程中的关键元素,它代表了一个匿名函数,即没有名字的函数,通常用于将函数作为参数传递给其他函数,或者作为返回值返回。在很多现代编程语言中,如Java 8、Python、JavaScript等,Lambda...

    JSLearning:存储我学到的东西的JS代码

    它不仅是一个个人的学习笔记,也是一个共享的资源库,帮助其他开发者解决问题或找到灵感。下面,我们将深入探讨这个项目可能包含的一些核心JavaScript概念和应用。 1. **变量与数据类型**:JavaScript是动态类型的...

    loveWall:微信小程序项目(表白墙)

    【表白墙微信小程序项目】是由刘胜制作的一款基于JavaScript技术的微信...通过深入研究并理解loveWall-master中的源代码,开发者可以学习到微信小程序的开发流程、API使用、数据管理以及用户体验设计等多个方面的知识。

    C#的一些文档笔记杂项

    7. **动态类型**:C# 4.0引入了动态类型,允许在运行时确定变量的具体类型,便于与非.NET框架库(如JavaScript或Python库)进行交互。 8. **委托与事件**:C#中的委托类似于函数指针,可以将方法作为参数传递,常...

    -KotlinStudy-:정정정리

    在深入探讨Kotlin编程语言之前,先要明白“정정정리”在韩语中的含义,这可能是作者对整理和修正学习笔记的表述。Kotlin是一种现代、静态类型的编程语言,由JetBrains公司开发,主要用于Android应用开发,但也适用于...

    java8源码-MyBook:我的书

    在这个名为"MyBook"的项目中,我们很可能看到一个基于Java 8的开源系统,它可能是作者个人的学习笔记、代码示例或者一个实际的应用程序。下面将详细探讨Java 8的关键特性,以及它们在实际开发中的应用。 1. **...

Global site tag (gtag.js) - Google Analytics