在JavaScript中向函数体动态添加嵌套函数

在JavaScript中向函数体动态添加嵌套函数,javascript,nested,nested-function,Javascript,Nested,Nested Function,在JavaScript中,函数中可以包含函数 function cow() { function moo() { console.log("moo"); } moo(); } cow(); 是否可以动态添加嵌套函数?像这样的 function cow() { moo(); } cow.moo = function () { console.log("moo1"); }; cow(); 如果你问“可能吗”,那么答案很遗憾是

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

function cow() {
  function moo() {
    console.log("moo");
  }
  moo();
}
cow();
是否可以动态添加嵌套函数?像这样的

function cow() {
  moo();
}

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

cow();
如果你问“可能吗”,那么答案很遗憾是肯定的:

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

 cow(function moo() {
   console.log(see);
 });
但是除了这种攻击,它实际上是不可能的,因为JavaScript有词法范围,这意味着只有源代码中的位置才能决定函数可以访问哪些变量。您不能更改源代码中的位置(除非您将字符串作为代码动态计算,而您不应该这样做)

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

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

如果您问“是否可能”,那么答案很遗憾是肯定的:

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

 cow(function moo() {
   console.log(see);
 });
但是除了这种攻击,它实际上是不可能的,因为JavaScript有词法范围,这意味着只有源代码中的位置才能决定函数可以访问哪些变量。您不能更改源代码中的位置(除非您将字符串作为代码动态计算,而您不应该这样做)

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


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

是的,我认为是这样。尝试删除
moo()cow
,使用
bob=new cow()
创建新的cow。然后,您可以使用
bob.moo()
.nope在
bob
上调用moo。你想干什么?不一样。在第二种情况下,添加一个属性
moo
,该属性是对象
cow
的函数。函数是JavaScript中的对象。@evolutionxbox这两个代码块中没有一个可以实现此功能。第一个代码块创建一个作用域为函数
cow
的函数
moo
。第二个代码块创建一个“静态”函数作为
cow
的属性。所有这些都不会在
cow.prototype
上创建实例方法。您可以创建一个curried函数,如
const outer=(func)=>()=>func(),inner=outer(()=>console.log(“moo”);内(),但如果没有更多的上下文,就无法判断这是否适用于这里。是的,我想是这样。尝试删除
moo()cow
,使用
bob=new cow()
创建新的cow。然后,您可以使用
bob.moo()
.nope在
bob
上调用moo。你想干什么?不一样。在第二种情况下,添加一个属性
moo
,该属性是对象
cow
的函数。函数是JavaScript中的对象。@evolutionxbox这两个代码块中没有一个可以实现此功能。第一个代码块创建一个作用域为函数
cow
的函数
moo
。第二个代码块创建一个“静态”函数作为
cow
的属性。所有这些都不会在
cow.prototype
上创建实例方法。您可以创建一个curried函数,如
const outer=(func)=>()=>func(),inner=outer(()=>console.log(“moo”);内(),但如果没有更多的上下文,就无法判断这是否适用于此处。