-
函数实际上是对象,所以函数名就是指向函数对象的指针,而且不一定与函数本身紧密绑定。
-
函数定义的方式有四种:
- 函数声明的方式定义,函数定义最后没有加分号。
- 函数表达式,函数末尾是有分号的。
- 箭头函数。
Function构造函数(不推荐)
-
JavaScript 引擎在任何代码执行之前,会先读取函数声明,并在执行上下文中生成函数定义。这个过程叫作函数声明提升。
-
而函数表达式必须等到代码执行到它那一行,才会在执行上下文中生成函数定义。
-
任何可以使用函数表达式的地方,都可以使用箭头函数。
-
箭头函数不能使用
arguments、super和new.target,也不能用作构造函数。此外,箭头函数也没有prototype属性。 -
使用不带括号的函数名会访问函数指针,而不会执行函数。
-
arguments对象是一个类数组对象。arguments对象可以跟命名参数一起使用,它的值始终会与对应的命名参数同步。 -
arguments对象的长度是根据传入的参数个数,而非定义函数时给出的命名参数个数确定的。 -
arguments对象有一个callee属性,是一个指向arguments对象所在函数的指针。 -
ECMAScript 中的所有参数都按值传递的。不可能按引用传递参数。如果把对象作为参数传递,那么传递的值就是这个对象的引用。
-
定义了两个同名函数,则后定义的会覆盖先定义的。
-
比如 Java 中,一个函数可以有两个定义, 只要签名(接收参数的类型和数量)不同就行。ECMAScript 函数没有签名,自然也就没有重载,可以通过检查参数的类型和数量,然后分别执行不同的逻辑来模拟函数重载。
-
使用默认参数时,
arguments对象的值不反映参数的默认值,只反映传给函数的参数。 -
函数的默认参数只有在函数被调用时才会求值,不会在函数定义时求值。
-
参数初始化顺序遵循“暂时性死区”规则,即前面定义的参数不能引用后面定义的。
-
函数可以用在任何可以使用变量的地方。
-
在标准函数中,
this引用的是把函数当成方法调用的上下文对象,这时候通常称其为this值。 -
在箭头函数中,
this引用的是定义箭头函数的上下文。 -
函数的两个方法
apply()和call()都会以指定的this值来调用函数,即会设置调用函数时函数体内this对象的值。 -
apply()和call()真正强大的地方并不是给函数传参,而是控制函数调用上下文即函数体内this值的能力。这样的好处是可以将任意对象设置为任意函数的作用域,这样对象可以不用关 心方法。 -
bind()方法会创建一个新的函数实例, 其this值会被绑定到传给bind()的对象。 -
尾调用,即外部函数的返回值是一个内部函数的返回值。
-
尾调用优化的条件就是确定外部栈帧真的没有必要存在了。涉及的条件如下:
- 代码在严格模式下执行;
- 外部函数的返回值是对尾调用函数的调用;
- 尾调用函数返回后不需要执行额外的逻辑;
- 尾调用函数不是引用外部函数作用域中自由变量的闭包。
-
闭包指的是那些引用了另一个函数作用域中变量的函数,通常是在嵌套函数中实现的。
-
因为闭包会保留它们包含函数的作用域,所以比其他函数更占用内存。过度使用闭包可能导致内存过度占用。
-
任何定义在函数或块中的变量,都可以认为是私有的,因为在这个函数或块的外部无法访问其中的变量。
-
特权方法(privileged method)是能够访问函数私有变量(及私有函数)的公有方法。