2014-07-08 2 views
2

폐쇄와 관련된 문제가있어 의심을 표시하고 싶습니다. 나는 원래 정의 된 바깥에있는 스코프에 함수 접근을 시도하려고한다. 예를 들어 다음과 같은 코드 블록이 예상대로 작동합니다.JavaScript 동적 마감 범위

(function(){ 

    function Outer() { 
     var test = "closure access"; 
     return function Inner() { 
      alert(test); 
     }; 
    }; 

    // call outer then inner 
    Outer()(); 

}()); 

"클로저 액세스"문자열이 실행될 때 경고됩니다.

그러나 내부 함수가 "외부"범위 외부에서 정의 된 다음 "외부"함수에서 반환 된 경우 더 이상 로컬 "test"변수에 액세스 할 수 없습니다. 예를 들어 : 그것은 그 위에 정의 된 "내부"기능을 찾을 정상 범위의 이상으로

(function(){ 

    function Inner() { 
     alert(test); 
    }; 

    function Outer() { 
     var test = "closure access"; 
     return Inner; 
    }; 

    // call outer then inner 
    Outer()(); 

}()); 

이 문제는 실제로보고있는 "외부"기능으로 나에게 의미가, 그리고 내부 함수는 범위 내에서 정의되지 않은 "외부"의 로컬 var "테스트"중 하나입니다. 내 질문은 어딘가에 (다른 곳에서) 함수를 정의하는 방법이 있지만 그 함수의 변수를 여전히 보존하면서 다른 함수에서 동적으로 반환하는 방법이 있습니까?

내가 더 잘 설명해야하는지 알려주세요.

==== 편집 ====은

확인하므로 함수를 정의하는 범위를 생성 및 기능을 사용하지. 다음 코드 스 니펫은 함수를 정의하지 않습니까?

(function(){ 

    function Outer() { 
     var test = "closure access"; 
     return new Function("alert(test);"); 
    }; 

    // call outer then inner 
    Outer()(); 

}()); 

새로운 함수가 테스트 변수에 대한 액세스 권한이없는 메모리의 해당 지점에서 함수를 정의하는 경우?

+3

아니요, 함수 범위는 함수를 사용하지 않고 함수를 정의하여 만듭니다. – dandavis

+0

그것은 본질적으로 우리에게 사유 재산과 방법을 제공합니다. 아아, 우리는 모든 것을 생성자에 넣으려고 결심해야합니다. – MaxArt

답변

0

내 질문에, 어딘가에 (다른 곳에서) 함수를 정의하는 방법이 있지만 그 함수의 변수를 여전히 보존하면서 다른 함수에서 동적으로 반환하는 방법이 있습니까?

아니요. 해당 범위의 변수에 액세스하려면 함수를 정의해야합니다.

그러나 동적으로 다른 함수를 사용할 수 있으므로 어떻게 든이 동작을 시뮬레이션 할 수 있습니다. 그럼에도 불구하고 항상 새로운 기능을 만들어야합니다.

다음 코드 단편은 기능을 정의하지 않습니까? 이 전역에서 선언 된 것처럼

return new Function("alert(test);"); 

아니오 Function constructor는 범위 체인없이, 즉 함수를 생성한다. eval을 사용해야합니다.

0

모든 기능은 동일한 개체에서 정의되는 경우, U는 사용이

(function(){ 
    function Inner() { 
     alert(this.test); 
    }; 
    function Outer() { 
     this.test = "closure access"; 
     return Inner; 
    }; 
    // call outer then inner 
    Outer()(); 
}()); 

하지만 함수이어서 유 (이) prototype.call (이) 또는 prototype.apply를 사용할 수있는 다른 객체에서 정의되어 있으면 참조를 전달하고 그런 식으로 다른 개체 속성에 액세스 할 수 있습니다.