Skip to content

函数进阶

1、递归和堆栈

递归

递归(recursion) 是一种编程模式,适用于一个任务可以拆分成多个相同类型的任务时使用。

实现一个计算pow(x, n),计算xn 次方。

javascript
// 1. 迭代: 使用for 循环
function pow(x, n) {
  let result = 1;

  for (let i = 0; i < n; i++) {
    result *= x;
  }

  return result;
}

// 2. 递归:调用自身
function pow(x, n) {
  if (n == 1) {
    return x;
  } else {
    return x * pow(x, n - 1);
  }
}

提示

最大的嵌套调用次数(包括首次) 被称为递归深度

最大递归深度受限于JavaScript 引擎。

执行上下文

执行上下文是一个内部数据结构,它包含有关函数执行时的详细细节:

  • 当前控制流所在的位置
  • 当前的变量
  • this 的值
  • ...

提示

一个函数被调用时仅具有一个与其相关联的执行上下文。

当一个函数进行嵌套调用时,将发生以下的事儿:

  1. 当前函数被暂停;
  2. 与它关联的执行上下文被一个叫做执行上下文堆栈的特殊数据结构保存;
  3. 执行嵌套调用;
  4. 嵌套调用结束后,从堆栈中恢复之前的执行上下文,并从停止的位置恢复外部函数。

10、构造函数和 new 操作符

构造函数:主要用来实现可重用的对象

  • 以大写字母开头
  • 只能用new 操作符执行

当一个函数被new 操作符执行时,会执行以下步骤:

  1. 创建一个新的空对象,并分配给this
  2. 函数体执行。通常它会修改this,并为其添加新的属性
  3. 返回this 的值
javascript
function User(name) {
  // this = {}; (隐式创建)

  // 为this添加属性
  this.name = name;

  // return this; (隐式返回)
}