如何在另一个函数内部重定义函数指针?
如何通过传参在函数内部修改外部的函数指针
首先明确你的初始代码无效的原因:
在JavaScript/TypeScript中,所有参数传递都是按值传递——哪怕是函数这类对象类型,传递的也是函数引用的副本。你在prueba函数里给fnc_赋值新函数,只是修改了这个局部参数变量的引用,完全不会影响外部的ptr变量,因为两者是独立的变量,只是最初共享了同一个函数引用。
可行的传参修改方案
方案1:用包装对象传递引用
把函数指针放在一个对象里,传递这个对象给目标函数。因为对象的引用副本指向同一个内存地址,修改对象的属性会直接同步到外部:
type OnLog = () => void; // 用对象包装函数指针 const fnWrapper = { fn: (() => {}) as OnLog }; function prueba(fncWrapper: { fn: OnLog }) { fncWrapper.fn = () => { console.log('hola'); }; } prueba(fnWrapper); fnWrapper.fn(); // 输出 'hola'
如果需要继续使用ptr变量,可以让它始终指向包装对象的属性:
let ptr = fnWrapper.fn; // 注意:若后续修改fnWrapper.fn,ptr不会自动更新,需重新赋值或直接使用fnWrapper.fn
方案2:传递Setter函数
定义一个用来更新外部变量的函数,把这个Setter函数作为参数传递,在目标函数里调用Setter修改外部变量:
type OnLog = () => void; let ptr: OnLog = () => {}; function prueba(setFn: (newFn: OnLog) => void) { setFn(() => { console.log('hola'); }); } // 传递更新ptr的函数 prueba((newFn) => { ptr = newFn }); ptr(); // 输出 'hola'
这两种方式都能实现你想要的“通过传参在函数内部修改外部函数指针”的需求,本质是利用对象引用或函数闭包突破按值传递的限制,让内部函数能影响外部变量。
内容的提问来源于stack exchange,提问作者J. Pablo García
相关产品推荐
相关产品推荐

