You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测函数是否为最后调用函数?及数学表达式求值器实现咨询

咱们一个一个来解决这两个问题哈:

如何检测某个函数是否是最后被调用的函数?

这个需求得看你用的是什么语言,我拿JavaScript举例子,给你两种实用的思路:

  • 直接扒调用栈:在你要检测的函数里生成一个Error对象,它的stack属性会记录整个调用链。你可以把栈信息拆分成行,然后看看当前函数的调用记录是不是栈里的最后一项。比如这样写:
function checkIfLast() {
  const err = new Error();
  // 把栈拆成每一行,过滤掉空行
  const stackLines = err.stack.split('\n').filter(line => line.trim());
  // 栈的第二项一般是当前函数的调用记录(第一项是Error本身)
  const currentCall = stackLines[1].trim();
  // 取最后一条有效调用记录
  const lastCall = stackLines.pop().trim();
  
  if (currentCall === lastCall) {
    console.log('嘿,我就是最后被调用的函数!');
  } else {
    console.log('唔,前面还有函数调用我呢');
  }
}

// 测试一下
checkIfLast(); // 会输出"嘿,我就是最后被调用的函数!"
function wrap() { checkIfLast(); }
wrap(); // 输出"唔,前面还有函数调用我呢"
  • 给函数加调用追踪钩子:如果你的环境里所有函数都能被你控制,可以给每个函数套一层追踪逻辑,记录最后一次被调用的函数名,然后在目标函数里检查自己是不是这个“最后一位”。代码大概是这样:
let lastCalled = null;

// 封装一个追踪函数的工具
function withTracking(func) {
  return function(...args) {
    lastCalled = func.name; // 记录当前调用的函数名
    return func.apply(this, args); // 执行原函数
  };
}

// 给目标函数加追踪
const myTarget = withTracking(function myTarget() {
  if (lastCalled === 'myTarget') {
    console.log('我是最后被调用的!');
  }
});

const anotherFunc = withTracking(function anotherFunc() {});

myTarget(); // 输出"我是最后被调用的!"
anotherFunc();
myTarget(); // 再次输出
实现支持add/subtract/cnst/variable的数学表达式求值器

你之前想返回字符串的思路不太对哦,因为题目要求表达式本身是一个函数,调用时传入变量值就能得到结果。核心思路是:每个函数(cnst、variable、add、subtract)都返回一个“求值函数”,这个求值函数接收变量的取值,最终算出结果。

咱们一步步写:

  1. 常量函数cnst:传入一个数字,返回的函数不管给什么参数,都返回这个常量。
function cnst(num) {
  return () => num;
}
  1. 变量函数variable:传入变量名(比如"x"),返回的函数接收变量的取值,返回对应的值。如果要支持多变量,后面可以扩展成传对象,但先按示例来:
function variable(name) {
  return (xValue) => {
    if (name === 'x') return xValue;
    // 如果要加y、z,这里加判断就行
    throw new Error(`不认识的变量:${name}`);
  };
}
  1. 二元操作函数add和subtract:这俩是二元操作,所以要接收两个子表达式(也就是两个求值函数),返回的新函数会先算出两个子表达式的值,再做加减运算。
function add(exprA, exprB) {
  return (x) => exprA(x) + exprB(x);
}

function subtract(exprA, exprB) {
  return (x) => exprA(x) - exprB(x);
}

现在测试你给的示例:

let expression = add(cnst(2), add(cnst(2), variable("x")));
console.log(expression(3)); // 输出7,完美符合要求!

如果想扩展支持多变量,比如x和y,只需要改一下variable函数:

function variable(name) {
  return (vars) => {
    if (vars[name] !== undefined) return vars[name];
    throw new Error(`未知变量:${name}`);
  };
}

// 调用的时候传对象
let expr = add(variable("x"), variable("y"));
console.log(expr({x: 3, y: 4})); // 输出7

内容的提问来源于stack exchange,提问作者Эмиль Бураиндов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:28:32