在JavaScript中向函数体动态添加嵌套函数
在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(); 如果你问“可能吗”,那么答案很遗憾是
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”);内()代码>,但如果没有更多的上下文,就无法判断这是否适用于此处。