1 函数创建

2 函数声明

函数声明提示;意思就是执行代码之前就先读取函数声明。
函数 - 图1

3 函数表达式

函数 - 图2

4 函数的非标准的name属性

一个非标准的 name 属性,通过这个属性可以访问到给函数指定的名字。这个属性的值永远等于跟在 function 关键字后面的标识符。
//只在 Firefox 、Safari、Chrome 和 Opera 有效。
alert (functionName.name); // ‘functionName’

5 递归

函数 - 图3

6 arguments

arguments.callee是一个指向正在执行函数的指针。
严格模式下不能通过脚本访问arguments.callee。访问这个属性会导致错误。
函数 - 图4
严格模式下,不能通过脚本访问 arguments.callee , 访问这个属性会导致错误。不过,可以使用命名函数表达式来达到相同的效果。
函数 - 图5

7 闭包

8 定义:

函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称为:闭包(这个术语非常古老,是指函数变量可以被隐藏于作用域链之内,因此看起来函数将变量“包裹”了起来。)
来自:《JavaScript权威指南第六版》

9 代码实例:

例子1:

1.1
函数 - 图6
1.2
函数 - 图7
1.3
函数 - 图8

例子2:

函数 - 图9

例子3:

函数 - 图10函数 - 图11

10 call和apply方法

call 和 apply 都是函数的方法。调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。

11 apply:

  • 将函数作为对象的方法来调用
  • 将参数以数组的形式传递给该方法

注意:call()方法的作用和 apply() 方法类似,区别就是call()方法接受的是参数列表,而apply()方法接受的是一个参数数组。

12 语法:

func.apply(thisArg, [argsArray])
函数 - 图12
函数 - 图13
需要注意:Chrome 14 以及 Internet Explorer 9 仍然不接受类数组对象。如果传入类数组对象,它们会抛出异常。

13 示例代码

简单的 apply 小例子

var fn = function(year) {
this.year = year;
alert(‘我叫:’ + this.name + ‘;’ + ‘我今年:’ + this.age + ‘岁’ + ‘; 今年:’ + year)
};

var obj = { name : ‘lixiaohua’ , age : 32};
fn.apply(obj,[‘2019’])

用 apply 将数组添加到另一个数组

var array = [‘a’, ‘b’];
var elements = [0, 1, 2];
array.push.apply(array, elements);
console.info(array); // [“a”, “b”, 0, 1, 2]

使用apply和内置函数

函数 - 图14
但是当心:如果用上面的方式调用apply,会有超出JavaScript引擎的参数长度限制的风险。当你对一个方法传入非常多的参数(比如一万个)时,就非常有可能会导致越界问题, 这个临界值是根据不同的 JavaScript 引擎而定的(JavaScript 核心中已经做了硬编码 参数个数限制在65536),因为这个限制(实际上也是任何用到超大栈空间的行为的自然表现)是未指定的. 有些引擎会抛出异常。更糟糕的是其他引擎会直接限制传入到方法的参数个数,导致参数丢失。举个例子:如果某个引擎限制了方法参数最多为4个(实际真正的参数个数限制当然要高得多了, 这里只是打个比方), 上面的代码中, 真正通过 apply传到目标方法中的参数为 5, 6, 2, 3 而不是完整的数组。
如果你的参数数组可能非常大,那么推荐使用下面这种策略来处理:将参数数组切块后循环传入目标方法:
函数 - 图15

使用apply来链接构造器

你可以使用apply来链接一个对象构造器,类似于Java。在接下来的例子中我们会创建一个全局Function 对象的construct方法 ,来使你能够在构造器中使用一个类数组对象而非参数列表。
函数 - 图16
函数 - 图17

14 bind()方法

参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
bind()方法创建一个新的函数,在调用时设置this关键字为提供的值。并在调用新函数时,将给定参数列表作为原函数的参数序列的前若干项。

15 语法和描述:

function.bind(thisArg[, arg1[, arg2[, …]]])
函数 - 图18
函数 - 图19

16 参考《JavaScript权威指南第6版》描述

函数 - 图20
函数 - 图21
函数 - 图22
函数 - 图23
函数 - 图24
函数 - 图25
函数 - 图26

17 示例代码

代码1:简单的绑定

函数 - 图27

代码2:创建绑定函数

bind() 最简单的用法是创建一个函数,不论怎么调用,这个函数都有同样的 this 值。JavaScript新手经常犯的一个错误是将一个方法从对象中拿出来,然后再调用,期望方法中的 this 是原来的对象(比如在回调中传入这个方法)。如果不做特殊处理的话,一般会丢失原来的对象。基于这个函数,用原始的对象创建一个绑定函数,巧妙地解决了这个问题:
函数 - 图28