如何在特定范围内执行代理函数内的语句?

问题描述 投票:0回答:1

我有一个函数,它接受一个函数作为参数

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);

但是这样一来,我们就没有自由决定执行哪条语句了。

如何实现我定义以下任一目标的目标:

  1. 要么定义一个与 fn 具有相同作用域的函数(就像我正在做的那样)(即,它可以看到
    fn
    本身看到的所有变量)。
  2. 使
    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.
}

///////////////////////////////////////////////////////////////////
javascript algorithm scope
1个回答
0
投票

我想执行

fn
范围内的每条语句。

这是不可能的。闭包作用域在 JavaScript 中是私有的,无法从外部访问。

© www.soinside.com 2019 - 2024. All rights reserved.