2017-05-04 42 views
1

我在調用另一個函數,並都具有相同名稱的組件的功能。
它的作品,運行的功能
我想知道爲什麼它工作(見我的假設下面)? 一個後續問題,如果我想遞歸調用外部函數我應該使用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(){ // 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(); 
} 

回答

2

請注意,組件myMethod方法被定義爲對象(類)的方法,以便把它從你必須使用this.myMethod()任何組件的方法調用。有沒有可能性,即調用myMethod()(不this.)的任何組件方法中會調用組件的方法具有相同的名稱。如果你沒有在方法中定義myMethod變量,並試圖調用它,你會得到一個錯誤,告訴myMethod is not defined。所以,這樣的代碼會給你提到的錯誤:當你調用一個函數JS首先試圖找到最接近的範圍定義這樣的功能(在你的情況下,組件myMehod方法體內),如果沒有這樣的功能JS移動

myMethod(){ 
    myMethod(); 
} 

到下一個(父母)範圍(在你的情況下,它將與定義反應組件的範圍相同)並嘗試再次找到它等等。但是重要的是組件方法沒有在任何這些範圍中定義,但是被定義爲類方法,所以你必須使用this.myMethod來告訴JS你的意思是在'this'對象上定義的方法。通常要調用任何對象方法,您必須使用與對象關聯的方法名稱。
如果不是組件方法,而是正常的功能,情況會有所不同。考慮這樣的代碼:

//here is outer scope 
function myMethod() { 
    //here is inner scope 
    myMethod(); // this will call function defined in outer scope 
} 

myMethod(); 

它會給你太多的遞歸「的錯誤 - 沒有在內部範圍內定義,因此JS使用的外部範圍定義的函數沒有myMethod功能。
如果現在重寫與具有相同名稱的內可變外功能就不會有錯誤:

//here is outer scope 
 
function myMethod() { 
 
    //here is inner scope 
 
\t var myMethod = function() { 
 
\t \t console.log(12); 
 
\t } 
 
\t myMethod(); 
 
} 
 

 
myMethod();

在內部範圍限定上述代碼變量覆蓋功能在外部範圍定義,以便JS在內部範圍內發現myMethod,甚至不嘗試在外部範圍內搜索myMethod
回到你的問題 - 是的,如果你想遞歸調用外部函數,你必須使用this.myMethod()

問題編輯更新
至於你關於命名慣例這兩個選項將工作的問題。這只是代碼可讀性和良好實踐的問題。我個人使用不同的有意義的名字。在你的例子中,我會使用例如方法名稱爲handleTouch,道具名稱爲touchCallback。通常,使用相同名稱來理解不同函數的代碼更加困難 - 您必須更加註意掌握函數的作用和來自哪裏(是作爲通道傳遞的組件方法還是函數?)。
如果您使用相同的名稱,特別是在別人讀取您的代碼時,通常很容易感到困惑。當然,如果兩個或多個組件具有相同名稱的方法,但是如果一個函數調用另一個函數IMO,它們應該有不同的名稱,因爲它們具有不同的用途,應該反映在它們的名稱中。

+0

好吧,你基本上重複了我的邏輯片段。如果我正確理解你,爲了調用「父」方法'遞歸地我需要在它自己內部使用'this.myMethod'(外部'myMethod') –

+1

好吧,剛剛看到你的編輯:) –

+0

這是一種常見的做法嗎? (在反應中使用道具) –