2017-05-04 44 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

这是一种常见的做法吗? (在反应中使用道具) –