Javascript高级程序设计第二版第七章匿名函数--笔记
匿名函数就是没有名字的函数,有时候也称为拉姆达(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高级程序设计第二版第七章匿名函数--笔记相关推荐
- Javascript高级程序设计第二版第十一章--DOM2,DOM3--笔记
今天跟诸位分享一下,高程,第二版,11章,dom2,dom3 纵观这一章,一个概念,dom在变,现在变,未来变,反正不断的变. 不过变来变去,ie是不支持dom2,dom3,可能未来新版本支持部分do ...
- Javascript高级程序设计第二版第四章--变量,作用域及内存问题--笔记
由于JavaScript 变量松散类型的本质,决定了它是在特定时间用于保存特定值的一个名字而已,变量的值及其数据类型可以在脚本的生命周期内改变.这可能既有趣又强大,同时又容易出问题. 4.1 语法 E ...
- Javascript高级程序设计第二版第十四章--异常--笔记
chaepter 14 错误异常分享. 其实主要是就是 try{ }catch(error){ } finally { } 这个语句的理解. 主要一点: finally 在 return 之后 运行. ...
- Javascript高级程序设计第二版第十二章--Event--笔记
今天给诸位分享一下 chapter 12 Events 所谓事件就是页面与文档窗口发生交互的瞬间.当年事件发生时它可以被预定(程序处理). 事件有两个过程,冒泡过程,或捕获过程. 冒泡是自上而下,捕获 ...
- JavaScript 高级程序设计第二章
第二章 教材: JavaScript 高级程序设计 目录 第二章 一. script元素 1. 介绍 2. 标签位置 2.1. 推迟执行脚本---defer属性 2.2. 异步执行脚本---async ...
- JavaScript高级程序设计:6.7.8章阅读札记
第六章 :对象 6.1 对象的属性 对象的属性分为两类:数据属性.访问器属性 A: 数据属性 configurable(能否通过delete删除属性从而重新定义属性) enumerable(是否可通过 ...
- c语言程序设计第二版第五章课后答案甘勇,郑州工程技术学院副院长甘勇来校讲学和指导工作...
12月12日,郑州工程技术学院副院长甘勇一行莅临我校讲学和指导工作.黄河交通学院评建办公室主任汤迪操.教务处处长贾宗璞,智能工程学院领导班子.主任及骨干教师参加了本次会议,会议由智能工程学院党总支书记 ...
- python语言程序设计基础第二版第七章答案-Python核心编程第二版 第七章课后答案...
注:我使用的python3.5. 其中range和xrange,input和raw_input已经合并 7-1.字典方法.哪个字典方法可以用来把两个字典合并到一起. dict.update(dict2 ...
- javascript高级程序设计pdf_一个老牌程序员推荐的JavaScript的书籍,看了真的不后悔!...
很多人问我怎么学前端?我的回答是:读书吧!相对于在网上学习,在项目中学习和跟着有经验的同事学习,书中有着相对完整的知识体系,每读一本好书都会带来一次全面的提高.而如果深一脚浅一脚的学习,写出代码的质量 ...
最新文章
- 零基础入门学习Python(17)-函数的参数
- QIIME 2教程. 20实用程序Utilities(2021.2)
- php twig扩展,如何写一个自定义的 Twig 扩展
- Linux PF_INET6 定义
- 百练OJ:1007:DNA排序
- hdu1176 免费馅饼 动态规划 二维数组实现
- 简单写一下选择排序算法
- Cream Finance已批准将BAC作为抵押资产
- MySQL二十八规范数据库设计
- activiti7的流程图、模板图及子流程图展示
- 博客在六个方面降低网络营销费用
- mysql中数据处理小技巧
- Mac安装软件时各种异常情况的解决方法
- #2016京东实习生笔试之生日礼物
- UE4球体根据镜头方向前进
- Vue3官网-高级指南(十五)Vue 与 Web Components
- 计算机图形学:Mesh
- SCTF2018 Writeup
- 设计模式(单一职责原则)
- BootstrapDialog.show函数底层简化