2017-05-04 15 views
1

私は、別の関数を呼び出すコンポーネント内に同じ名前を持つ関数を持っています。
両方の機能が動作します
私が知りたいのはなぜですか(私の前提を参照してください)? 私は外部関数を再帰的に呼び出す場合は、this.myMethod()を使用する必要がありますか?
このパターンは安全ですか?同じ名前の関数の中でpropsのメソッドを呼び出す

例:

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という名前の関数を探していることを前提とし、それを見つけました。
誰でもこの前提を確認できますか?ただ、このパターンがどのように共通の安全についての私の質問は、より明確にする

EDIT

のは、私はItemのコンポーネントを持っており、それがPropTypes.funconTouch小道具を持っているとしましょう、私は自分自身の関数内でいくつかの内部のロジックを実行し、コールバックまたは似たよう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

ので、あなたはthis.myMethod()を使用する必要が任意のコンポーネントメソッドからそれを呼び出すために、そのコンポーネントmyMethodメソッドがオブジェクト(クラス)メソッドとして定義されますのでご注意ください。任意のコンポーネントメソッド内でmyMethod()this.なし)を呼び出すと、同じ名前のコンポーネントメソッドが呼び出される可能性はありません。メソッド内にmyMethod変数を定義せずに呼び出すと、myMethod is not definedというエラーが表示されます。

myMethod(){ 
    myMethod(); 
} 

関数を呼び出すときにJSは、まずそのような機能JSの移動はありません場合は、(コンポーネントmyMehodメソッド本体内部のあなたのケースでは)最も近いスコープで定義されたような機能を探してみてください:だから、このようなコードはあなたにエラーを言及を与えます次の(親の)スコープ(あなたのケースでは、反応コンポーネントが定義されているのと同じスコープになります)を見つけようとします。しかし、これらのスコープではコンポーネントメソッドが定義されていませんクラスメソッドとして定義されていますので、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機能はありません。
あなたが今エラーはないだろうと同じ名前で、内部変数と外側の関数をオーバーライドする場合:JSので、外側のスコープで定義された内部スコープオーバーライド機能で定義されている上記のコード変数で

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

 
myMethod();

を範囲内にmyMethodがあり、外側の範囲でmyMethodを検索しようとしません。
質問に戻る - はい、外部関数を再帰的に呼び出す場合は、this.myMethod()を使用する必要があります。

質問編集更新
名前付けの練習に関するご質問は、両方のオプションが有効です。それは単なるコードの可読性と良いプラクティスの問題です。私は個人的に意味のある別の名前を使用します。私の例では、メソッド名はhandleTouch、小物名はtouchCallbackです。一般的に、異なる関数に同じ名前を使用してコードを理解することは難しくなります。どの関数がどこから来ているのかを把握するために注意を払う必要があります(コンポーネントメソッドまたは関数は小道具として渡されますか?
一般に、誰かがあなたのコードを読んでいる場合、特に同じ名前を使用すると混乱するのは簡単です。もちろん、2つ以上のコンポーネントが同じ名前を持つメソッドを持っていても、同じような仕事をしているのですが、ある関数が別の関数IMOを呼び出すと、異なる名前を持たなければなりません。

+0

まあまあ、あなたは基本的に私のロジックをそのスニペットで繰り返しました。私があなたを正しく理解しているならば、 "親"のメソッドを再帰的に呼び出すためには、自分自身の中で 'this.myMethod'を使う必要があります(外側の' myMethod') –

+1

okあなたの編集を見ました:) –

+0

それは普通の練習ですか? (小道具を使った反応) –

関連する問題