【问题标题】:Add a nested function to a function body dynamically in JavaScript在 JavaScript 中动态地将嵌套函数添加到函数体
【发布时间】:2021-02-20 21:22:56
【问题描述】:

在 JavaScript 中,函数中可以包含函数。

function cow() {
  function moo() {
    console.log("moo");
  }
  moo();
}
cow();

是否可以动态添加嵌套函数?像这样?

function cow() {
  moo();
}

cow.moo = function () {
  console.log("moo1");
};

cow();

【问题讨论】:

  • 是的,我想是的。尝试从cow 中删除moo();,并使用bob = new cow() 创建新奶牛。然后,您可以使用bob.moo()bob 上调用moo。
  • 不。你想做什么?
  • 不一样。在第二种情况下,您向对象cow 添加一个属性moo,它是一个函数。函数是 JavaScript 中的对象。
  • @evolutionxbox 这两个代码块都不能完成这项工作。第一个代码块创建一个函数moo,其作用域为函数cow。第二个代码块创建一个“静态”函数作为cow 的属性。这些都不会在cow.prototype上创建实例方法。
  • 您可以创建像 const outer = (func) => () => func(), inner = outer(() => console.log("moo")); inner(); 这样的柯里化函数,但如果没有更多上下文,无法判断这是否适用于此。

标签: javascript nested nested-function


【解决方案1】:

好吧,如果你问“有没有可能”,那么可悲的是,答案是肯定的:

  function cow(fn) {
    let see = "oh no";
    eval(fn.toString())();
 }

 cow(function moo() {
   console.log(see);
 });

但除了这个 hack 之外,这实际上是不可能的,因为 JavaScript 有 词法作用域,这意味着只有源代码中的位置决定了函数可以访问哪些变量。您不能更改源代码中的位置(除非您将字符串动态评估为代码,但您不应该这样做)。

如果只是动态地调用某个函数,而不从外部函数访问变量,那么你可以只传递一个函数作为参数(这在 JavaScript 中实际上很常见):

  function cow(moo) {
     moo();
  }

 cow(function mooo() {
   console.log("mooo");
 });

当然,您还可以将参数传递给moo() 调用,并在mooo 函数(或任何其他函数)中接收它们。

【讨论】:

    猜你喜欢
    • 2020-04-29
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    相关资源
    最近更新 更多