![](/img/trans.png)
[英]How to call a function expression which being nested inside another function?
[英]How to call child function which is declared inside another function
函数b在函数a中声明。 所以,我试图在功能a之外调用功能b。 它没有被调用。
var a = function() {
alert("a");
var b = function() {
alert("b");
}
}
输出:-功能b称为带有消息b的警报框
您需要返回b
并使用它。 这将涉及调用函数a
开头,但随后您将拥有一个可以反复调用以提醒b
的函数:
var a = function() { alert("a"); var b = function() { alert("b"); } return b; } var messageB = a(); messageB(); messageB();
尝试在“ a”函数外部声明“ b”变量:
var b;
var a = function() {
alert("a");
b = function() {
alert("b");
};
};
这样,您可以访问b
从外面a
,因为它是在它之外声明。 前a
被称为第一次,这将是undefined
的,所以你不能调用b
前a
。 此外,如果你调用a
两次,以前b
将被重写,如下所示:
var b;
var a = function(name) {
b = function() { alert(name); };
};
a("first version");
b(); // first version
a("second version");
b(); // second version
如果你不需要任何内部变量a
内部b
,没有理由嵌套虽然功能,在这种情况下,你应该有两个独立的功能:
var a = function() { alert("a"); };
var b = function() { alert("b"); };
首先返回该函数并调用它,
var a = function() { alert("a"); var b = function() { alert("b"); } return b; } var b = a(); b();
如前所述,您可以简单地返回函数b。 Java语言中的函数可以像这样传递,这是垃圾收集语言的一个很好的功能。
但是您可以做得更好,如果您想公开多个功能呢?
您可以只返回带有附加方法的对象。
function A() { let value = 0; return { inc: () => ++ value, dec: () => -- value, show: () => console.log(value) } } const a1 = A(); a1.inc(); a1.inc(); a1.show(); const b1 = A(); b1.inc(); b1.dec(); b1.dec(); b1.show();
现在,上面的内容看起来与所谓的class
非常相似,但事实并非如此。 这样做的一个缺点是,如果您想创建数千个实例,则一个类会更好,因为它可以将其方法放在原型上。 话虽如此,正如使用React Hooks所发现的那样,那时还不是很糟糕。
上述的一个大好处,就是你不必陷入泥泞的世界this
实例的背景下。
为了完整起见,这里是一个类版本。
class A { value = 0; inc() { ++ this.value; } dec() { -- this.value; } show() { console.log(this.value) } }; const a1 = new A(); a1.inc(); a1.inc(); a1.show(); const b1 = new A(); b1.inc(); b1.dec(); b1.dec(); b1.show();
也有人说一个简单的解决方案是使a
和b
都成为全局变量,但越避免使用全局变量越好,因此,如果a
和b
有共同的意图,则使用闭包甚至一个类会更好。
或者如果您需要对象批准
`var a = function() {
print("a");
this.b = function() {
print("b");
}
return this
}
a().b()`
所有其他答案都足够好,但是以防万一您可能喜欢directly calling
inner function
without returning
该函数的方法。
您可以将内部函数(即b
包装成这种情况,作为这样的自调用函数,
var a = function() {
alert("a");
var b = (function() {
alert("b");
})()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.