【红宝书】第7章.函数表达式

定义函数的方法两种

  1. 函数声明

function fnName(arg0, arg1, arg2) {

//函数体

}

重要特征:函数声明提升

  1. 函数表达式

let fnName = function(arg0, arg1, arg2) {

//函数体

}

即创建一个匿名函数(因为function关键字后面没有标识符)赋值给变量fnName

使用前必须先赋值

7.1递归

递归函数是一个函数通过名字调用自身的情况下构成的

function fn(num) {

if (num <= 1) {

return 1;

} else {

return num * fn(num - 1);

}

}

但是在某些情况下会出错,如

let fn1=fn

fn=null

fn1(3)

使用arguments.callee(是一个指向正在执行的函数的指针,因此可以实现对函数的递归调用)

function fn(num) {

if (num <= 1) {

return 1;

} else {

return num * arguments.callee(num - 1);

}

}

但在严格模式下无法访问arguments.callee,可以使用命名函数表达式达成相同的效果

let fn1 = function f(num) {

if (num <= 1) {

return 1;

} else {

return num * f(num - 1);

}

}

7.2闭包

闭包概念:有权访问另一个函数作用域中的变量的函数

function fn(property) {

return function(obj1, obj2) {

let val1 = obj1[property];

let val2 = obj2[property];

// 做其他操作

};

}

执行环境、作用域、作用域链

function compare(val1, val2) {

if (val1 < val2) {

return -1;

} else {

return 1;

}

}

let result = compare(5, 10);

7.2.1闭包和变量

副作用:闭包只能取得包含函数中任何变量的最后一个值

可以通过创建另一个匿名函数强制让闭包的行为符合预期

7.2.2关于this对象

匿名函数的执行环境具有全局性,此this对象通常指向window

可以用let that=this重指向解决

7.2.3内存泄漏

闭包作用域链保存HTML元素,则该元素无法被销毁

在使用后重新赋值null解除引用,减少其引用数,确保正常回收其占用的内存

7.3模仿块级(私有)作用域

(function(){

// 块级作用域

})

7.4私有变量

任何在函数中定义的变量,都可以认为是私有变量

有权访问私有变量和私有函数的公有方法成为特权方法

创建特权方法的方式:

  1. 在构造函数中定义特权方法,有构造模式的缺点

function MyObj() {

let val = 10;

function fn() {

return false;

}

this.publicMethod = function() {

val++;

return fn();

};

}

  1. 在私有作用域中定义特权方法

7.5小结

原文地址:https://www.cnblogs.com/Mijiujs/p/12080364.html

时间: 2024-08-02 22:26:39

【红宝书】第7章.函数表达式的相关文章

紫书第4章 函数和递归

1  序 系统的整理下第四章的学习笔记.同上次一样,尽量在不依赖书本的情况下自己先把例题做出来.这次有许多道题代码量都比较大,在例题中我都用纯C语言编写,但由于习题的挑战性和复杂度,我最终还是决定在第五章开始前,就用C++来完成习题.不过所有的代码都是能在C++提交下AC的. 在习题中,我都习惯性的构造一个类来求解问题,从我个人角度讲,这会让我的思路清晰不少,希望自己的一些代码风格不会影响读者对解题思路的理解. 其实在第四章前,我就顾虑着是不是真的打算把题目全做了,这些题目代码量这么大,要耗费很

OPENGL 红宝书实验笔记

第一个程序triangles的配置过程,原文链接. OpenGL的东西快忘光了,把角落的第八版红宝书拿出来复习一下 从书中的地址下了个示例代码结果新系统(Win10+VS2015)各种跑不起来,懊恼之后在网上疯狂搜索资料终于跑起来了,记录一下 一.环境搭建指南 书中的地址 http://www.opengl-redbook.com/ 去这里打包下载OpenGL红宝书的示例代码,解压后是这样 虽然没有第一章的代码但第一章的内容好歹算一个完整的例子,网上各种环境搭建教程也都以第一章的代码为例,我们就

【转载】关于在vs2013中配置opengl红宝书第八版环境

 本文为转载 原文地址 http://blog.csdn.net/qq821869798/article/details/45247241 本人刚开始学习opengl,买了一本opengl红宝书第八版, 第一个例子研究了一段时间终于可以运行了,不知道有没有童鞋跟我遇到一样的问题. 下面说说我怎么配置的: 首先去 http://www.opengl-redbook.com/ 下载红宝书的源代码,解压得到这个 然后打开vs2013新建一个空的win32控制台项目, 然后点项目右键属性,点击vc++目

VS2012通过makefile编译OpenGL红宝书的示例代码

> 通过创建新VC项目,然后设置一堆属性,对于懒人来说还是太复杂了.既然它自带了makefile,可以尝试下使用nmake. 需要注意的是VS2012的安装目录里面已经没有GL的头文件和库文件.这个改动应该在VS2010或者更早就已经采用了. 现在有了VS SDK.VS2010自动的SDK目录是C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A,更高的版本可能使用v8.0.v8.0A,反正都在这个目录下面.这个目录下面有include.lib文

熬了多少个夜晚,大家期待的《网络工程师思科华为华三实战案例红宝书》即网工必备技术命令大全版本1完书

熬了多少个夜晚,最近也没空更新博客.军哥编写的大家期待的<网络工程师思科华为华三实战案例红宝书>即网工必备技术命令大全版本1完书,一本融合了思科华为华三的实战型辅导书(辅助乾颐堂QCNA课程的).不多说上图 目录关于作者 2本书读者和笔者心语 3本书内容和结构 4第1部分 网络实施基础 15案例0 模拟器的部署和连接管理 16学习利器模拟器简书 160.1 华为模拟器Ensp部署 160.2 思科模拟器EVE部署 310.3 部署SecureCrt管理网络设备 400.3.1 部署终端管理软件

js红宝书总结笔记

一.JS的简介: 1.宿主环境:浏览器.node.adobe flash; 2.DOM(文档对象模型)是针对 XML 但经过扩展用于 HTML 的应用程序编程接口(API): DOM0级:即DHTML:    DOM1级:主要映射文档结构: DOM2级:增加视图,样式,事件,遍历和范围: DOM3级:增加验证等方法: 3.BOM(浏览器对象模型) 二.在html中使用js 1.script的属性:defer(html4.01):脚本延迟至页面加载完成后执行:async(html5):不必等待脚本

JavaScript高级程序设计(第三版)第七章 函数表达式

一种是函数声明:另一种是函数表达式. 函数声明提升: say Hi(); function say Hi(){ alert("Hi!"); }      //这个例子不会抛出错误,因为在代码执行之前会先读取函数声明. 匿名函数:var functionName=function(arg0,arg1,arg2){函数体}; sayHi();   //错误:函数还不存在 var sayHi=function(){ alert("Hi!"); }; //不要这样做    

javascript高级程序设计笔记(第7章 函数表达式)

7.5 小结 在JavaScript 编程中,函数表达式是一种非常有用的技术.使用函数表达式可以无须对函数命名,从而实现动态编程.匿名函数,也称为拉姆达函数,是一种使用JavaScript 函数的强大方式.以下总结了函数表达式的特点.? 函数表达式不同于函数声明.函数声明要求有名字,但函数表达式不需要.没有名字的函数表达式也叫做匿名函数.? 在无法确定如何引用函数的情况下,递归函数就会变得比较复杂:? 递归函数应该始终使用arguments.callee 来递归地调用自身,不要使用函数名——函数

7章 函数表达式

定义函数的两种方式 函数声明 function functionName(arg0, arg1,arg2){     //函数体 } //非标准的name属性 //只在Firefox.Safari.Chrome和Opera有效 alert(functionName.name);    //'functionName' 特点: 函数声明提升(执行代码之前会先读取函数声明,因此可以把函数声明放在调用它的语句后面): 不能出现在判断.循环等位置. 函数表达式 //匿名函数(拉姆达函数) var fun