《JS高级程序设计》第10章 函数

170 阅读4分钟
  1. 函数实际上是对象,所以函数名就是指向函数对象的指针,而且不一定与函数本身紧密绑定。

  2. 函数定义的方式有四种:

    1. 函数声明的方式定义,函数定义最后没有加分号。
    2. 函数表达式,函数末尾是有分号的。
    3. 箭头函数。
    4. Function构造函数(不推荐)
  3. JavaScript 引擎在任何代码执行之前,会先读取函数声明,并在执行上下文中生成函数定义。这个过程叫作函数声明提升

  4. 而函数表达式必须等到代码执行到它那一行,才会在执行上下文中生成函数定义。

  5. 任何可以使用函数表达式的地方,都可以使用箭头函数。

  6. 箭头函数不能使用argumentssupernew.target,也不能用作构造函数。此外,箭头函数也没有prototype属性。

  7. 使用不带括号的函数名会访问函数指针,而不会执行函数。

  8. arguments对象是一个类数组对象。arguments对象可以跟命名参数一起使用,它的值始终会与对应的命名参数同步。

  9. arguments对象的长度是根据传入的参数个数,而非定义函数时给出的命名参数个数确定的。

  10. arguments对象有一个callee属性,是一个指向arguments对象所在函数的指针。

  11. ECMAScript 中的所有参数都按值传递的。不可能按引用传递参数。如果把对象作为参数传递,那么传递的值就是这个对象的引用。

  12. 定义了两个同名函数,则后定义的会覆盖先定义的。

  13. 比如 Java 中,一个函数可以有两个定义, 只要签名(接收参数的类型和数量)不同就行。ECMAScript 函数没有签名,自然也就没有重载,可以通过检查参数的类型和数量,然后分别执行不同的逻辑来模拟函数重载。

  14. 使用默认参数时,arguments对象的值不反映参数的默认值,只反映传给函数的参数。

  15. 函数的默认参数只有在函数被调用时才会求值,不会在函数定义时求值。

  16. 参数初始化顺序遵循“暂时性死区”规则,即前面定义的参数不能引用后面定义的。

  17. 函数可以用在任何可以使用变量的地方。

  18. 在标准函数中,this引用的是把函数当成方法调用的上下文对象,这时候通常称其为this值。

  19. 在箭头函数中,this引用的是定义箭头函数的上下文。

  20. 函数的两个方法apply()call()都会以指定的this值来调用函数,即会设置调用函数时函数体内this对象的值。

  21. apply()call()真正强大的地方并不是给函数传参,而是控制函数调用上下文即函数体内 this值的能力。这样的好处是可以将任意对象设置为任意函数的作用域,这样对象可以不用关 心方法。

  22. bind()方法会创建一个新的函数实例, 其this值会被绑定到传给bind()的对象。

  23. 尾调用,即外部函数的返回值是一个内部函数的返回值。

  24. 尾调用优化的条件就是确定外部栈帧真的没有必要存在了。涉及的条件如下:

    1. 代码在严格模式下执行;
    2. 外部函数的返回值是对尾调用函数的调用;
    3. 尾调用函数返回后不需要执行额外的逻辑;
    4. 尾调用函数不是引用外部函数作用域中自由变量的闭包。
  25. 闭包指的是那些引用了另一个函数作用域中变量的函数,通常是在嵌套函数中实现的。

  26. 因为闭包会保留它们包含函数的作用域,所以比其他函数更占用内存。过度使用闭包可能导致内存过度占用。

  27. 任何定义在函数或块中的变量,都可以认为是私有的,因为在这个函数或块的外部无法访问其中的变量。

  28. 特权方法(privileged method)是能够访问函数私有变量(及私有函数)的公有方法。