1. 函数定义

- 函数表达式:函数名称可有可无。若有函数名,则在函数体内指代该函数本身,并且只存在于函数体中。函数名称 === arguments.callee
- 函数声明:存在函数提升。变量只提升变量并不提升赋值,函数提升整个函数体都会提升,因此可在声明前调用函数。不能存在于循环。条件判断、try/cache、with等语句中。在ES6中可以。
- 构造函数:使用`new Function()`若传入一个参数则这个参数为函数体,传入多个参数则前面的都是函数实参,最后一个参数为函数体。在函数创建时解析,效率比前两种慢。运行的时候只能访问自己的本地变量和全局变量,不能访问Function构造器被调用生成的上下文的作用域。在全局作用域中创建执行。

2. 函数调用

2.1 函数调用

- 参数:计算参数表达式的值作为函数的实参传递给声明时的形参;
- 返回值:(1)在执行到return语句时返回,返回值为return之后的值。(2)若return后无值或者函数没有return语句(执行到函数末尾)则返回undefined.
- 调用上下文(this):非严格模式下是全局对象(window),严格模式下是undefined.

2.2 方法调用

如果函数表达式是作为**对象的属性调用**,则为方法调用。
- 参数:与普通函数相同。
- 返回值:与普通函数相同。
- 调用上下文(this):调用该方法的对象就是调用上下文。实质是给函数传入隐式的实参——调用该方法的对象。
- 方法链:如果方法的返回值是一个对象,则返回的对象还可以再调用它的方法形成方法链。**当方法不需要返回值时,最好之间返回this形成方法链。**
- `this`是关键字,没有作用域的限制。如果嵌套函数作为方法调用,则this指向调用它的对象。如果嵌套函数作为普通函数调用,则this指向全局对象或者undefined.

2.3 构造函数调用

在函数或者方法调用之前使用关键字new,则为构造函数调用。创建一个新的对象,继承构造函数的prototype属性。
- 参数:与普通函数相同。作为初始化对象的参数。
- 返回值:如果return语句返回一个对象,则这个对象为返回值。如果return没有返回值或者返回原始值,则这个新创建的对象作为返回值。
- 调用上下文(this):新创建的对象。

2.4 间接调用

使用`call()`,`apply()`方法显示制定调用所需的this值,使任何函数可以作为任何对象的方法调用。

3. 函数的实参和形参

- 形参:函数中定义的变量
- 实参:运行时的函数调用传入的参数
当实参个数 < 形参个数时,剩下的形参的值为undefined.因此,可给形参设置默认值,当传入的值为undefined时,形参就使用默认值。
- 实参对象:`arguments`指向实参对象的引用,是一个类数组对象,可通过数字下标访问传入的实参值,**该对象只在函数内部有效**。arguments[]应用场景是函数需要固定个数的命名必须参数和不定数的可选实参。`arguments`有两个属性:length和callee.length属性表示传入函数的实参的个数,callee指向当前执行的函数。
- 当参数过多时,可以使用对象的属性作为参数。解决参数顺序的问题。

4. 闭包

- 闭包:函数**对象**可以**通过作用域链相互关联起来**,函数体内部的变量都可以保存在函数作用域内。
- 函数的作用域链是在**函数定义**的时候创建的,并且在函数执行时依然有效。作用域链是一个对象列表或者链表,这组对象定义了这段代码“作用域"中的变量。对于不存在嵌套函数的函数体内,作用域上有两个对象:一是定义函数参数和局部变量的对象,二是全局对象。当函数返回时,从作用域链中将这个绑定变量的对象删除,如果没有其他引用指向这个绑定对象,则这个对象会被当做垃圾回收掉。但是在存在嵌套函数中,嵌套函数有自己的作用域链,并且这个作用域链指向一个变量绑定对象。因此,当外部函数将嵌套函数作为返回或者存储在某处的属性里时,就有外部引用指向嵌套函数,嵌套函数指向外部函数的变量对象,因此这个变量对象就不会被回收,还能访问。主要用于私有变量和私有方法。

5. 函数的属性和方法

5.1 函数的属性

- length属性:表示函数的形参的个数。即函数希望传入多少个参数。
- prototype:当将函数用作构造函数的时候,新创建的对象会从原型对象上继承属性。

5.2 函数的方法

- `call()`,`apply()`:使任何函数可以作为任何对象的方法调用。第一个参数传入调用上下文。对于`call()`来说第二个参数传入函数调用需要的实参。对于`apply()`来说第二个参数传入一个数组或者类数组对象,该数组包含函数调用的实参。
- `bind()`:创建一个新的函数。第一个参数传入新函数的调用上下文,后面的参数是函数调用的参数依次使用。

6. 函数式编程

- 高阶函数:接受一个或多个函数作为参数,并返回一个新函数。
- 不完全函数:可参照`bind`的应用。
- 记忆函数:使用私有变量作为缓存。

犀牛书——CHAP8:函数相关推荐

  1. javascript犀牛书_犀牛书作者:最该忘记的JavaScript特性

    作者: 李松峰 转发链接:https://mp.weixin.qq.com/s/guAN1Cz2gYfKdBhmUpLyVA 前言 JavaScript这门语言的第一个演示版差不多就在25年前诞生. ...

  2. JavaScrpit 犀牛书第七版笔记

    JavaScrpit 犀牛书第七版笔记 挖个坑吧,JavaScript 犀牛书英文的第七版(JavaScript: The Definitive Guide, 7th Edition)其实在去年(20 ...

  3. Javascript学习笔记(犀牛书1、2章)

    引子:本来一直在做尚品汇的Vue3项目的,在前期基础的积淀下做项目其实已经没什么难点了,但是最近出差网络很差,没法弄,为了把出差的空余时间利用起来,正好把基础再练习一下,之前我学python的时候是把 ...

  4. js犀牛书,学习心得笔记(一)

    最近每天都抽出时间看犀牛书,明显可以感觉到和以前看的时候有差别,阅读能力和心得有了很大的提升,以前不明白的一些知识点,还有一些隐藏在细节中的知识,现在都可以领悟到了. 1.包装对象 暂时性的包装对象 ...

  5. 牛年到! “犀牛书”最新版还远嘛?

    "犀牛书"凭着完整的内容.细致的讲解以及海量针对性的示例而受到全球读者的一致好评,经过几代前端人的口口相传,成为名副其实的JavaScript权威指南!至今它仍保持着生命力,影响着 ...

  6. 犀牛书第2章 JavaScript词法结构

    程序设计语言的词法结构是一套基本规则,用来详细说明如何使用这种语言来编写程序.它是一种语言的最低层次的语法,指定了变量名是什么样的,注释应该使用什么字符以及语句之间如何分隔等规则. 1. 字符集: J ...

  7. 犀牛书作者:最该忘记的JavaScript特性

    编者按:本文译者李松峰,资深技术图书译者,翻译出版过40余部技术及交互设计专著,现任360奇舞团Web前端开发资深专家,360前端技术委员会委员.W3C AC代表. 原文:https://davidf ...

  8. 比肩犀牛书的《JavaScript编程精》原书第3版(中文版)重磅来袭!文末福利

    JavaScript在网络时代诞生,从为静态网页添加各种炫目的特效,到现在几乎所有在线的交互网站和小程序,都大量使用了JavaScript.我们几乎每天都通过浏览器和各种应用与它打交道,它已成为我们日 ...

  9. java犀牛书_犀牛书学习笔记(9):继承

    OOP的特性之一就是继承,只有实现了继承的语言才能称之为OOP,本篇将说明javasctipt如何使用继承. 原型.构造函数和对象中的基于原型的继承概念 虽然本地对象都继承自Object,但实际上,可 ...

最新文章

  1. Altium Designer隐藏或显示元件名字
  2. IBM 340 亿美元收购 RedHat(红帽)
  3. 【Notes】《Thinking in Java》【Chapter 11】Part II
  4. 读懂 | 路由器简史
  5. BTCU 分叉,真的是比特币“千年痛点”克星吗?
  6. java导出excel 客户端_java如何将导出的excel下载到客户端
  7. 管理新语:搞绩效考评需谨慎,切勿随意
  8. 如何调整eclipse字体大小
  9. magisk卸载内置软件_刷入Magisk/SuperSU实现ROOT
  10. 巧用JMP公式,让新变量的生成更简单
  11. python 数据集中随机选择作为测试集、验证集
  12. 卸载抖音和微博的一天……
  13. Windows下安装Tensorflow-Slim(待续)
  14. 炭黑是做什么用的 炭黑起什么作用
  15. 管理的本质是协调还是决策?看看孙权是怎么做到的。
  16. ubuntu20.04 GPU基准测试
  17. 国内外Unity视频学习网站大全
  18. Idea 控制台console 不能搜索日志 CTRL F 快捷键无效
  19. 大学计算机相关的证书有哪些,大学最有含金量的6大类证书!你拥有哪几个?...
  20. Lua环境搭建 Win10

热门文章

  1. 开热点给电脑消耗大吗_你试过爬楼梯减肥吗?热量消耗大,选对姿势很重要!...
  2. python输入的方式有几种_Python输入方式具体的三种实现方式
  3. java反编译工具_推荐Java反编译工具luyten、jd-gui
  4. oracle的逻辑结构包括,oracle逻辑结构分析
  5. numpy多元线性回归_使用sklearn实现多元线性回归
  6. git checkoutbranch 回退到某个版本进行修改
  7. jinja Extends Blocks Include
  8. C语言 static
  9. 3.3 超参数训练的实践:Pandas VS Caviar
  10. git 应用 merge