簡體   English   中英

在具有相同名稱的函數中的props中調用方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM