返回

显式调用与隐式调用

前端

前言

函数的调用关系,谁调用了谁,我是谁,你清楚吗?除了Error的stack获取信息外,你还知道哪些手段知道了?

显式调用

显式调用是指在代码中直接调用函数,这种调用方式是最常见的。例如:

function add(a, b) {
  return a + b;
}

function multiply(a, b) {
  return a * b;
}

console.log(add(1, 2)); // 3
console.log(multiply(3, 4)); // 12

在上面的示例中,add()函数和multiply()函数都是通过显式调用来执行的。

隐式调用

隐式调用是指在代码中不直接调用函数,而是通过其他机制来调用函数。例如:

  • 事件处理程序: 事件处理程序是当某些事件发生时触发的函数。例如,当用户点击按钮时,可以触发一个函数来处理该事件。
  • 回调函数: 回调函数是传递给另一个函数作为参数的函数。当该函数被调用时,回调函数也会被执行。
  • 定时器: 定时器是可以安排在一定时间后执行的函数。例如,可以创建一个定时器来每隔一秒钟执行一次函数。

在上面的示例中,alert()函数和setTimeout()函数都是通过隐式调用来执行的。

获取调用关系

有几种方法可以获取函数的调用关系:

  • Error stack: 当发生错误时,可以获取Error对象的stack属性来获取调用关系。例如:
try {
  throw new Error('This is an error');
} catch (error) {
  console.log(error.stack);
}

输出:

Error: This is an error
    at index.js:12:13
    at <anonymous>:1:1
  • Activation record: 在JavaScript中,每个函数调用都会创建一个激活记录(activation record)。激活记录包含了函数的参数、局部变量和当前执行的代码行。可以通过访问激活记录来获取函数的调用关系。
  • Call stack: 调用栈(call stack)是存储函数调用关系的栈。当函数被调用时,它会被推入调用栈。当函数返回时,它会被弹出调用栈。可以通过访问调用栈来获取函数的调用关系。
  • Scope: 作用域(scope)是变量可以被访问的范围。作用域可以是全局作用域、函数作用域或块作用域。通过访问作用域,可以获取函数的调用关系。

小结

函数的调用关系是理解程序执行流程的重要组成部分。可以通过显式调用和隐式调用来调用函数。有几种方法可以获取函数的调用关系,包括Error stack、激活记录、调用栈和作用域。