2017-10-05 5 views
-1

JavaScript 내부의 다른 함수 안에있는 함수에 접근 할 수있는 방법이 있습니까?함수에있는 JavaScript 함수에 액세스하는 방법

function x(name, age) { 
 
    this.name = name; 
 
    this.age = age; 
 

 

 
    this.a = function() { 
 
    this.b = function() { 
 
     return "b"; 
 
    }; 
 

 
    return "a"; 
 
    }; 
 
} 
 

 
var xobj = new x('vin', 25); 
 
console.log(xobj.a.b()); //error

+0

사용 사례는 무엇입니까? 나에게 이것이 불분명 한 것처럼 보이는데, 왜 이것을 필요로 할까? 최상위 레벨에서 함수를 선언하고이 중독성이없는 패턴을 사용하지 않는 한 중첩하지 않아도됩니다. 나는 당신이 당신의 _problem_을 설명하는 것이 아니라 당신의 solution _ 문제를 설명하고 있다고 생각합니다. 어쩌면 우리가 이것에 대한 생각을 알면, 대신에 더 나은 대안을 줄 수 있습니다. – SidOfc

답변

2

당신은 당신이 x.a의 인스턴스()를 선언 한 후 전화를 할 것입니다

function x(name, age){ 
 
this.name =name; 
 
this.age = age; 
 
    
 

 
this.a = function(){ 
 
\t \t \t 
 
\t \t this.b = function(){ 
 
\t \t \t return "b"; 
 
     }; 
 

 
\t return "a"; 
 
    }; 
 
    
 
} 
 

 

 
var xobj =new x('vin',25); 
 
var xx = new xobj.a(); 
 
console.log(xx.b());

할 수

ㅁ B 함수는 new 키워드를 사용하여 생성자로 사용되며, 생성되는 새 객체에 바인딩됩니다. 그래서 this를 a() 함수 내에서 호출하려면 new 키워드를 사용하여 생성자를 만들어야합니다.

+3

이것은 답이 아닌 다른 점의 게임과 비슷합니다. 너는 무엇을 바꾸 었는가? 왜 문제를 해결해야합니까? – Quentin

+0

'xobj.a()'는 문자열''a "를 반환합니다. –

+0

아니요, ** new ** 연산자 때문에 인스턴스를 반환 할 것입니다. – marvel308

0

제 제안은이 상황을 피하고 @marvel308's answer을 사용하지 않는 것입니다. 나는 물론 사용자를 싫어하지 않는다. 나는 단지 링크 된 대답이 좋은 노력에도 불구하고 제공하는 가독성과 이해력을 싫어한다. 솔루션 일 수도 있지만, 이해하기 쉽지 않으므로 사용하는 것을 볼 때마다 반드시 Google에 알려야 할 것입니다.이를 피하십시오.

원하는 것에 따라 여러 가지 대안이 있습니다. 예를 들어 프로그램의 구조를보다 "평면적"으로 생각할 수 있습니다. 중첩은 일반적으로 일을 더 복잡하게 만듭니다. 따라서 피하는 것이 좋습니다. 행동

function Person(name, age) { 
    this.name = name; 
    this.age = age; 
} 

function sayHelloToPerson(person) { 
    console.log("Hello! " + person.name + ", it seems you are: " + person.age + " years old"); 
} 

:

이제 중첩이 절대적으로 필요합니다 것이 아닙니다, 당신은 최상위 수준에 정의 된 여러 기능을 사용하는 대신에,이 훨씬 더 간단한 솔루션을 선택할 수 있습니다 :

var me = new Person("SidOfc", 22); 
sayHelloToPerson(me); 
// => "Hello! SidOfc, it seems you are: 22 years old" 

유스 케이스가 너무 불분명하지만, 이러한 방법으로, 당신은 명확한 의도를 유지하기 때문에이 코드의 유용성에 대해 확신 할 수 없다 당신이 우리를 항상 할 수 함수가 필요로하는 모든 데이터를 전달하는 함수 인수 (이 경우 person 인수). 다른 모든 JS 개발자가 거기에 글로벌 네임 스페이스를 오염 싫어처럼

는 경우, 대신에보다 깊은 한 수준의 중첩의 안에 (내 예에 Person) x 관련된 모든 기능 직접 포장. 예 : 행동

function Person(name, age) { 
    this.name = name; 
    this.age = age; 

    this.sayHello = function() { 
     console.log("Hello! " + this.name + ", it seems you are: " + this.age + " years old"); 
     this.sayGoodbye(); 
    }; 

    this.sayGoodbye = function() { 
     console.log("Goodbye! " + this.name); 
    } 
} 

:

var me2 = new Person("SidOfc", 22); 
me2.sayHello(); 
// => "Hello! SidOfc, it seems you are: 22 years old" 
// since sayHello calls this.sayGoodbye() we also get: 
// => "Goodbye! SidOfc" 

이 뒤에 아이디어는 당신이 관련된 모든 기능을 만드는 것이 당신의 중첩과 동일한 수준에서 (내 예 Person) x.

그런 다음이 미친 중첩 구조없이 인스턴스 내의 다른 함수 속성을 쉽게 호출 할 수 있습니다.에서 해당 함수를 호출 할 때부터 인스턴스 (물론 필요에 따라 변경됨)를 호출해야하므로 매개 변수를 추가 할 필요가 없습니다.

추가 보너스로, 이제 깊이 파고 들지 않고 me2.somefunction()을 사용하여 기능에 액세스 할 수 있기 때문에 더 이상 요구하지 않아도됩니다.

희망 사항 :