我有一个函数,它接受一个函数作为参数
write(fn) {...}
。
我想操纵函数的执行并在代理其参数时执行一些语句。这是我的代码想法:
...
const handler = {
apply(target, thisArg, argumentsList) {
let params = getParamNames(target);
let statements = splitFunctionContent(target);
statements.forEach((statement) => {
let placeholders = refreshPlaceholders(params);
// Create a function with placeholders as parameters
const func = new Function(...Object.keys(placeholders), statement);
// Execute the function with placeholders as arguments
func(...Object.values(placeholders));
console.log(result);
result = "";
});
}
};
// Create a proxy for `fn` with the handler
const p = new Proxy(fn, handler);
// Call the proxied function
p();
每当代理函数内部存在函数调用时,上述处理都会给出引用错误。这意味着,正如预期的那样,由
new Function
定义的函数的当前作用域与原始 fn
的作用域不同。
我想执行
fn
范围内的每条语句。知道该怎么做吗?
处理此问题的一种方法是执行:
target.apply(thisArg, argumentsList);
但是这样一来,我们就没有自由决定执行哪条语句了。
如何实现我定义以下任一目标的目标:
fn
本身看到的所有变量)。fn
在其中执行一个非常具体的语句(因为 fn 本身正在执行它,所以我们没有范围问题)。作为一个更具体的例子,我们有:
// different scope which my function has access to //
write( (a, b, c) => {
myFunction({a, b, c});
});
function myFunction({a, b, c}) {
console.log(a);
console.log(b);
console.log(c);
}
/////////////////////////////////////////////////////
// The above does indeed have access to the write function below //
write(fn) {
...
statements.forEach((statement) => {
let placeholders = refreshPlaceholders(params);
// Create a function with placeholders as parameters
const func = new Function(...Object.keys(placeholders), statement);
// Execute the function with placeholders as arguments
func(...Object.values(placeholders));
}); // does not have access to myFunction;
// Create a proxy for `fn` with the handler
const p = new Proxy(fn, handler);
// Call the proxied function
p();
// target.apply(thisArg, argumentsList); // this does have access to myFunction and does not raise an error.
}
///////////////////////////////////////////////////////////////////
我想执行
范围内的每条语句。fn
这是不可能的。闭包作用域在 JavaScript 中是私有的,无法从外部访问。