匿名函数就是没有名字的函数,有时候也称为拉姆达(lambda)函数。

function functionName(){};

这是一个函数声明

在代码执行以前被加载到作用域中

var functionName = function(){};

这是一个函数表达式

在代码执行到那一行时才会有定义

7.1 递归

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)); // output 24

7.2 闭包

闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。

function fn(propertyName){

return function(object1){

var v1 = object1[propertyName]; //访问了外部变量propertyName变量

}

}

由于闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存,过度使用闭包可能会导致内存占用过多。所以建议只是在绝对必要时再考虑使用闭包。

7.2.1 闭包与变量

function createFunctions(){

var result = [];

for(var i=0; i<10; i++){

result[i] = function(num){

return function(){

return num;

}

}(i);

}

}

var funcs = createFunctions();

for(var i=0; i<funcs.length; i++){

document.write(funcs[i] + ‘<br />’); //output 0,1,2,3…9

}

7.2.2 this对象

this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环境具有全局性,因此对象通常指向window.

7.2.3 内存泄漏

如果闭包的作用域中保存着一个HTML元素,那么就意味着该元素无法被销毁。

function assignHandler(){

var element = document.getElementById(‘someElement’);

var id = element.id;

element.onclick = function(){

alert(id);

};

element = null; //变量设置为null,才能解除对DOM对象的引用,顺利减少引用数,确保正常回收其占用的内存

}

7.3 模仿块级作用域

匿名函数可以用来模仿块级作用域:

(function(){

//这里是块级作用域

})();

将函数声明包含在一对圆括号中,表示它实际上是一个函数表达式,而紧随其后的另一对圆括号会立即调用这个函数。

相当于:

var someFunction = function(){};

someFunction();

function(){}();

这一段会导致语法错误,因为JavaScript将function关键字当作一个函数声明的开始,而函数声明后面不能跟圆括号。然而,函数表达式的后面可以跟圆括号。要将函数声明转换成函数表达式,只要加上一对括号即可。

7.4 私有变量

任何在函数中定义的变量,都可以认为是私有变量。因为在函数外部不能访问这些变量。

把有权访问私有变量和私有函数的公有方法叫特权方法。

function MyObject(){

//私有变量

var privateVariable = 10;

function privateFunction(){

return false;

}

//特权方法

this.publicMethod = function(){

privateVariable ++;

return privateFunction();

}

}

7.4.1 静态私有变量

(function(){

var privateVariable = 10;

function privateFunction(){

}

Myobject = function(){

}

//公有/特权方法

Myobject.prototype.publicMethod = function(){

privateVariable ++;

return privateFunction();

}

})()

这个模式创建了一个私有作用域,并在其中封装了一个构造函数及相应的方法。

7.4.2 模块模式

单例创建私有变量和特权方法。所谓单例就是只有一个实例的对象。简单的语法如下:

var singleton = {

name: value,

method: function(){

//这里是方法

}

}

还可以添加私有变量和特权方法

var singleton = function(){

//私有变量和私有函数

var privateVariable = 10;

function privateFunction(){}

//特权/公有方法和属性

return {

publicProperty: true,

publicMethod: function(){

privateVariable++;

return privateFunction();

}

}

}

这个模式返回了一个匿名函数,在函数内部,定义私有变量和函数,然后将一个对象字面量作为函数的值返回。返回的对象字面量中只包含可以公开的属性和方法。

7.4.3 增强的模块模式

var singleton = function(){

//私有变量和私有函数

var privateVariable = 10;

function privateFunction(){

return false;

}

//创建对象

var object = new CustomType();

//添加特权/仅有属性和方法

object.publicProperty = true;

object.publicMethod = function(){

privateVariable++;

return privateFunction();

};

return object;

}

转载于:https://www.cnblogs.com/jikey/archive/2010/10/07/1802068.html

Javascript高级程序设计第二版第七章匿名函数--笔记相关推荐

  1. Javascript高级程序设计第二版第十一章--DOM2,DOM3--笔记

    今天跟诸位分享一下,高程,第二版,11章,dom2,dom3 纵观这一章,一个概念,dom在变,现在变,未来变,反正不断的变. 不过变来变去,ie是不支持dom2,dom3,可能未来新版本支持部分do ...

  2. Javascript高级程序设计第二版第四章--变量,作用域及内存问题--笔记

    由于JavaScript 变量松散类型的本质,决定了它是在特定时间用于保存特定值的一个名字而已,变量的值及其数据类型可以在脚本的生命周期内改变.这可能既有趣又强大,同时又容易出问题. 4.1 语法 E ...

  3. Javascript高级程序设计第二版第十四章--异常--笔记

    chaepter 14 错误异常分享. 其实主要是就是 try{ }catch(error){ } finally { } 这个语句的理解. 主要一点: finally 在 return 之后 运行. ...

  4. Javascript高级程序设计第二版第十二章--Event--笔记

    今天给诸位分享一下 chapter 12 Events 所谓事件就是页面与文档窗口发生交互的瞬间.当年事件发生时它可以被预定(程序处理). 事件有两个过程,冒泡过程,或捕获过程. 冒泡是自上而下,捕获 ...

  5. JavaScript 高级程序设计第二章

    第二章 教材: JavaScript 高级程序设计 目录 第二章 一. script元素 1. 介绍 2. 标签位置 2.1. 推迟执行脚本---defer属性 2.2. 异步执行脚本---async ...

  6. JavaScript高级程序设计:6.7.8章阅读札记

    第六章 :对象 6.1 对象的属性 对象的属性分为两类:数据属性.访问器属性 A: 数据属性 configurable(能否通过delete删除属性从而重新定义属性) enumerable(是否可通过 ...

  7. c语言程序设计第二版第五章课后答案甘勇,郑州工程技术学院副院长甘勇来校讲学和指导工作...

    12月12日,郑州工程技术学院副院长甘勇一行莅临我校讲学和指导工作.黄河交通学院评建办公室主任汤迪操.教务处处长贾宗璞,智能工程学院领导班子.主任及骨干教师参加了本次会议,会议由智能工程学院党总支书记 ...

  8. python语言程序设计基础第二版第七章答案-Python核心编程第二版 第七章课后答案...

    注:我使用的python3.5. 其中range和xrange,input和raw_input已经合并 7-1.字典方法.哪个字典方法可以用来把两个字典合并到一起. dict.update(dict2 ...

  9. javascript高级程序设计pdf_一个老牌程序员推荐的JavaScript的书籍,看了真的不后悔!...

    很多人问我怎么学前端?我的回答是:读书吧!相对于在网上学习,在项目中学习和跟着有经验的同事学习,书中有着相对完整的知识体系,每读一本好书都会带来一次全面的提高.而如果深一脚浅一脚的学习,写出代码的质量 ...

最新文章

  1. 零基础入门学习Python(17)-函数的参数
  2. QIIME 2教程. 20实用程序Utilities(2021.2)
  3. php twig扩展,如何写一个自定义的 Twig 扩展
  4. Linux PF_INET6 定义
  5. 百练OJ:1007:DNA排序
  6. hdu1176 免费馅饼 动态规划 二维数组实现
  7. 简单写一下选择排序算法
  8. Cream Finance已批准将BAC作为抵押资产
  9. MySQL二十八规范数据库设计
  10. activiti7的流程图、模板图及子流程图展示
  11. 博客在六个方面降低网络营销费用
  12. mysql中数据处理小技巧
  13. Mac安装软件时各种异常情况的解决方法
  14. #2016京东实习生笔试之生日礼物
  15. UE4球体根据镜头方向前进
  16. Vue3官网-高级指南(十五)Vue 与 Web Components
  17. 计算机图形学:Mesh
  18. SCTF2018 Writeup
  19. 设计模式(单一职责原则)
  20. BootstrapDialog.show函数底层简化

热门文章

  1. Kotlin 学习笔记08
  2. new Date()时间
  3. LeetCode题解-3-Longest Substring Without Repeating Characters
  4. PE文件RV转FOA及FOA转RVA
  5. 开源个小工具simple-repo
  6. 搞懂Java的反射机制
  7. mysql 索引效果是否叠加_MySQL基础实用知识集合(二)
  8. Android怎么插手机卡,魅蓝E手机卡怎么装 魅蓝E手机SIM卡安装图文教程
  9. 58到家MySQL军规升级版
  10. Ubantu下使用vi时,方向键变字母输出、退格键无法删除字符的解决办法