2017-03-25 1 views
0

함수 내에서 콜백을 작성하면 그 콜백을 통해 해당 함수 내의 로컬 변수에 액세스 할 수 있습니까?콜백 내 함수의 로컬 변수에 액세스

Obj.prototype.outerFunc = function() 
{ 
    var x = 0; 
    var callback = this.innerFunc; 
    callback(); 
} 

Obj.prototype.innerFunc = function() 
{ 
    x++; 
} 

x 자연스럽게 innerFunc의 범위 내에 있지 및 자체에 의해 호출하면 오류가 발생합니다. 하지만 outerFunc에서 전화하면 x에 액세스하려면 innerFunc's 범위를 확장 할 수 있습니까?

편집 : 함수에 인수를 전달하거나 Obj의 x와 인스턴스를 만들고 싶지 않아야한다고 언급 했어야합니다. 나는 마치 outerFunc에 로컬로 선언 된 것처럼 innerFunc을 처리하려고합니다. 아래에서 수행 할 수있는 것과 유사합니다.

Obj.prototype.outerFunc = function() 
{ 
    var x = 0; 
    var callback = function() { 
     x++; 
    } 
    callback(); // works 
} 
+0

유일한 방법은 'outerFunc'가 공유 범위에'x'를 넣는 것입니다. 전역 범위는 모든 기능간에 공유됩니다. 그러나 피 호출자의 범위에 직접적인 영향을 줄 수있는 방법은 없습니다. 기본적으로 당신은 * dynamic scope *라고 부릅니다. JavaScript 및 대부분의 언어는 * 어휘 범위 *를가집니다. –

답변

2

예 : 이것은 함수 매개 변수와 정확히 일치합니다. 하나의 범위에서 다른 범위로 값을 전달할 수 있습니다.

Obj.prototype.outerFunc = function() 
{ 
    var x = 0; 
    var callback = this.innerFunc; 
    x = callback(x); 
} 

Obj.prototype.innerFunc = function(x) 
{ 
    x++; 
    return x; 
} 

값은 변수가 아니라 다른 함수로 전송됩니다. 따라서 값을 반환하고이를 사용하기 위해 값을 할당해야합니다.

// constructor 
var Obj = function() {} 

Obj.prototype.outerFunc = function() 
{ 
    this.x = 0; 
    var callback = this.innerFunc.bind(this); 
    callback(); 
} 

Obj.prototype.innerFunc = function() 
{ 
    this.x++; 
} 

var instance = new Obj() 
instance.outerFunc() 
console.log(instance.x) // returns 1 

편집 : 당신이 프로토 타입을 사용하는 경우

+0

언급 했어야하지만 인수로 x를 전달하지 않으려 고합니다. (원래의 질문에 편집을 참조하십시오.) – sookie

+0

@sookie 이것은 정확히 어떤 기능이 피해야하는 것입니다. – lonesomeday

0

, 그냥 인스턴스 속성을 설정하지만 lonesomeday의 대답은 훨씬 더 나은 솔루션입니다 @ 그것은 더 많은 기능 접근 방식을 취하고로 피 부작용 :

+0

미안 해요, 언급 했어야하지만 실제로 Obj의 인스턴스를 x 피하기 위해 노력하고있어 (내가 원래 질문을 만든 편집 참조) – sookie

0

이렇게의 단련 시킨다면 방법이 하드 약간 knowi없이 해결하는 this.x

Obj.prototype.outerFunc = function() 
{ 
    this.x= 0; // set x to zero 
    this.innerFunc(); 

} 

Obj.prototype.innerFunc = function(x) 
{ 
    this.x++; 
    return this.x; 
} 
+0

고마워. 나는 실제로 Obj의 인스턴스를 만들지 않으려 고하고있다. (원래의 질문으로 만든 편집 참조) – sookie

+0

outerFunc에서 프로토 타입을 추가 할 수 있다면 x는 액세스 가능하거나 객체 외부에 x를 만들 수있다. – MartinWebb

0

통해 모든 기능을 액세스 할 수있는 개체의 범위 X를 할당하는 것이다 왜 매개 변수를 전달하고 싶지 않은지; 특정 함수 시그니처 만 갖고 싶다면 고차 함수가 도움이 될 수 있습니까?

Obj.prototype.outerFunc = function() 
{ 
    var x = 0; 
    var callback = this.innerFunc(x); 
    callback(); 
} 

Obj.prototype.innerFunc = function(x) 
{ 
    return function() { /* use x in here */ }; 
} 

이렇게 두 가지 기능이 있습니다. 외부 변수는 매개 변수를 취하고 내부 변수는 외부 변수에 전달되는 변수에 액세스 할 수 있습니다.

물론 이것은 예제에서 보여준 것의 절반 만 제공합니다. 로컬 변수에 액세스 할 수는 있지만 수정할 수는 없습니다.

0

어떤 상황에서도 OOP 컨텍스트 또는 다른 방법으로 함수 외부에서 함수의 내부 변수에 액세스 할 수 없습니다.

유일한 예외는 함수 B 내부에서 정의되고 해당 함수 B에서 반환되는 함수 A가 함수 B의 변수에 계속 액세스 할 수 있다는 것입니다. 즉 클로저의 기본 개념입니다.

왜 인스턴스 변수를 사용하고 싶지는 모르겠다. 그게 바로 그들이하는 방법입니다 - 방법을 통해 데이터를 공유합니다. 나는 당신이 왜 값을 안팎으로 전달하기를 원하지 않는지 전혀 모른다. 그것은 매개 변수와 반환 값이 무엇을위한 것인지이다.

x에 액세스하려면 innerFunc의 범위를 확장 할 수 있습니까?

아니요, 그 의미가 무엇이든간에. JS에는 그런 개념이 없다.

당신이 아마하고 싶은 것 무엇에 올 수있는 가장 가까운 생성자에서 변수를 정의하는 것입니다 :

function Obj() { 
    var x = 0; 

    this.outerFunc = function() { 
    var callback = this.innerFunc; 
    callback(); 
    }; 

    this.innerFunc = function() { 
    x++; 
    } 
} 

그러나,이 this.innerFunc이 컨텍스트를 찾을 수 없기 때문에 그대로 작동하지 않습니다. 따라서 그러나

var callback =() => this.innerFunc(); 

작성해야 할 것입니다, 당신은 단지 this.innerFunc()를 작성하는 대신이 작업을 수행 할 이유 신비입니다.

관련 문제