2012-11-25 3 views
1

목표는 깨끗한 코드를 작성하면서 클로저를 사용하는 것입니다. 내가 알아 차 렸던 것은 어떻게 든 나의 익명의 기능 중 하나가 하나 이상의 경우에 필요하기 때문에 항상 반복되는 것을 끝내는 것입니다.어떻게 함수 포인터로 클로저를 사용할 수 있습니까?

이 목표를 위해, 나는이 재사용 기능을 나중에 다시 사용할 수있는 객체에 저장하려고합니다.

지금, 내 질문에. 이 예가 http://jsfiddle.net/tiagoespinha/tTx64/이고 알림이 실행되지 않습니다. y이 null이므로 내가 함수를 인라인 경우

그러나, 모든 http://jsfiddle.net/tiagoespinha/tTx64/1/

이 문제를 해결하기위한 트릭이 있습니까 잘 작동? 첫번째 예제에서 어떻게 작동시킬 수 있습니까? 변수 y이 여전히 존재합니다. 왜 JS가 그것을 잡을 수 없습니까?

+1

이것은 클로저가 작동하는 방식입니다. 함수를 정의하면 정의 된 범위에 액세스 할 수 있습니다.이 경우에는 다른 범위의 변수에 액세스해야합니다. 함수형 프로그래밍에서 가장 간단한 해결책은 인수를 통해이 변수에 함수가 액세스하도록하는 것입니다. – samuil

답변

1

자체 변수 (y) 및 공유 기능이있는 객체를 원합니다.

정말 필요한 것은 아마도 프로토 타입 일 것입니다.

function Holder() { 
    this.y = 5; 
    this.myFn(); 
} 
Holder.prototype.myFn = function() { 
    alert("The value of the closure var is " + this.y);   
} 
new Holder(); 

그냥 폐쇄와 OOP를 다시하려고하지 않도록 내가 Introduction to Object-Oriented JavaScript의 독서를 건의 할 것입니다.

+0

해결책 주셔서 감사합니다!나는 내가하고있는 일이 직접적으로 가능하지 않다는 것을 의심하고 실제로이 문제에 직면했다. 건배! –

1
//our constructor, each instance will carry a y of 5 
function Proto() { 
    this.y = 5; 
} 

//a shared function for all instances 
Proto.prototype.returnedFn = function() { 
    alert("The value of the closure var is " + this.y); 
} 

//just a wrapper for the new instance call. 
//I just like it this way to avoid using "new" when making instances 
function newFn() { 
    //return a new instance 
    return new Proto(); 
} 

//test it out 
newFn().returnedFn(); 
newFn().returnedFn(); 
+0

솔루션을 제공해 주셔서 감사합니다. –

1

첫 번째 예는 일을 동적 범위 지정의 어떤 종류가 필요합니다. Javascript가 정적으로 범위가 지정됩니다.

클로저를 사용하면 함수가 정의 된 범위에서 일부 로컬 변수를 캡처 할 수 있습니다. 은 변수 y이 포함 된 범위에 정의되어 있지 않습니다.

함수의 모든 인스턴스에는 자체 클로저가 있습니다. 따라서 한 번 함수를 정의하고 서로 다른 문맥에서 다른 y을 참조하게 할 수는 없습니다. (두 번째 예에서 내부 기능은 마다 당신이 newFn를 호출 너무 많은 경우가 y의 자체 사본 각, 존재할 수를 정의한다.)

+0

이제는 의미가 있습니다. 함수가 정의되고 실행될 때 범위가 해석되지 않습니다. 설명 주셔서 감사합니다! –

0

가 나는 또한보고 내 자신의 질문에 대답을 추가 할 것입니다 내 결과.

제공된 다른 솔루션과 OOP 솔루션을 부분적으로 사용하여 클로저를 사용하는 다른 방법을 발견했습니다.

// Object prototype which takes an argument 
function MyObj(abc) { 

    // Declare function using a closure 
    // and thus being able to use the argument 
    this.myFn = (function(){ 
     return function() { 
      alert("abc is " + abc); 
     }; 
    })();     
} 

// Then we can simply create an object with the 
// desired argument and the function will behave as expected 
var v = new MyObj(10); 
v.myFn(); 

나는 내가 정말 개체의 로컬 값을 저장하지 않음을 생략하기 때문에 아무도 가능성이 솔루션을 제공하지 생각합니다. 간단히 말해서, 어떤 값을 전달하고, 한 함수에서 그것들을 사용하고, 그 다음에 그 객체를 없애기를 원할뿐입니다.

이 경우 순수 OOP 솔루션이 과도하다고 생각합니다.

아무튼, 제안 된 모든 해결책에 대해 감사드립니다.

관련 문제