[英]Call a method in props inside a function with the same name
我在調用另一個函數的組件中有一個函數,並且兩者都具有相同的名稱。
它起作用,兩個功能都運行
我想知道它為什么起作用(請參閱下面的假設)? 后續問題,如果我想遞歸調用外部函數,應該使用this.myMethod()
嗎?
使用這種模式安全嗎?
例:
myMethod(){
const {myMethod} = this.props;
if(typeof myMethod == 'function'){ // i was sure this will check the external myMethod func
myMethod(); // i was sure it will call the external myMethod func.
}
// what if i want to call to the external "myMethod" func (recursively)?
}
我假設引擎正在外部myMethod
的主體(詞法作用域?)內搜索名為myMethod
的函數,並且找到了它。
誰能確認這個假設?
編輯
只是為了讓我的問題更清楚地說明這種模式的普遍性和安全性。
比方說,我有一個組件Item
,它有一個onTouch
的道具PropTypes.func
,我想經營自己的函數里面的一些內部邏輯,然后運行它通過接收到的功能props
作為回調或類似的東西。
我應該為內部函數(如onInternalTouch
尋找一個新名稱還是使用onTouch
保持相同的名稱onTouch
嗎?
onTouch(){ // is this common practice?
const {onTouch} = this.props;
// ... internal component logic
onTouch();
}
onInternalTouch(){ // or should i bother finding a new name?
const {onTouch} = this.props;
// ... internal component logic
onTouch();
}
請注意,組件myMethod
方法被定義為對象(類)方法,因此從任何必須使用this.myMethod()
組件方法中進行調用。 不可能在任何組件方法中調用myMethod()
(沒有this.
)將以相同的名稱調用組件方法。 如果未在方法內部定義myMethod
變量並嘗試調用它,則會收到一條錯誤消息,提示myMethod is not defined
。 因此,這樣的代碼將給您提到的錯誤:
myMethod(){
myMethod();
}
當您首先調用函數JS時,首先嘗試找到在最接近范圍內定義的函數(在您的情況下位於組件myMehod
方法主體中),如果沒有這樣的函數,則JS移至下一個(父)范圍(在您的情況下,它將是相同的)定義了React組件的作用域),然后嘗試再次查找它。等等。但是很重要的一點是,沒有在任何這些作用域中定義組件方法,而是將其定義為類方法,因此您必須使用this.myMethod
來告訴JS您的意思是在“此”對象上定義的方法。 通常,調用任何對象方法都必須使用與對象關聯的方法名稱。
如果不是組成方法而是正常功能,情況將有所不同。 考慮這樣的代碼:
//here is outer scope
function myMethod() {
//here is inner scope
myMethod(); // this will call function defined in outer scope
}
myMethod();
它會給您“太多的遞歸”錯誤-內部范圍中沒有定義myMethod
函數,因此JS使用外部范圍中定義的函數。
如果現在使用具有相同名稱的內部變量覆蓋外部函數,則不會有錯誤:
//here is outer scope function myMethod() { //here is inner scope var myMethod = function() { console.log(12); } myMethod(); } myMethod();
在上面的代碼中,內部作用域中定義的變量將覆蓋外部作用域中定義的函數,因此JS在內部作用域中找到myMethod
,甚至不嘗試在外部作用域中搜索myMethod
。
回到您的問題-是的,如果要遞歸調用外部函數,則必須使用this.myMethod()
。
問題編輯更新 :
至於您有關命名慣例的問題,這兩個選項均適用。 這只是代碼可讀性和良好實踐的問題。 我個人會使用其他有意義的名稱。 在您的示例中,我將使用例如handleTouch
作為方法名稱,並使用touchCallback
作為道具名稱。 通常,對於不同的函數使用相同的名稱來理解代碼會更加困難-您必須更加注意掌握函數的用途以及它的來源(它是組件方法還是作為prop傳遞的函數?)。
通常,如果您使用相同的名稱,尤其是別人讀取您的代碼時,很容易感到困惑。 當然,如果兩個或多個組件執行相同的工作,如果兩個或多個組件具有相同名稱的方法完全可以,但是如果一個函數調用另一個函數IMO,則它們應該具有不同的名稱,因為它們具有不同的用途,這應該反映在其名稱中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.