如何检测函数是否为最后调用函数?及数学表达式求值器实现咨询
咱们一个一个来解决这两个问题哈:
如何检测某个函数是否是最后被调用的函数?
这个需求得看你用的是什么语言,我拿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)都返回一个“求值函数”,这个求值函数接收变量的取值,最终算出结果。
咱们一步步写:
- 常量函数cnst:传入一个数字,返回的函数不管给什么参数,都返回这个常量。
function cnst(num) { return () => num; }
- 变量函数variable:传入变量名(比如"x"),返回的函数接收变量的取值,返回对应的值。如果要支持多变量,后面可以扩展成传对象,但先按示例来:
function variable(name) { return (xValue) => { if (name === 'x') return xValue; // 如果要加y、z,这里加判断就行 throw new Error(`不认识的变量:${name}`); }; }
- 二元操作函数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,提问作者Эмиль Бураиндов
相关产品推荐
相关产品推荐

