![](/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.