2010-04-08 4 views
20

함수를 호출하면 해당 호출에 대해 로컬 범위가 설정됩니다. 해당 범위를 객체로 직접 참조 할 수있는 방법이 있습니까? 윈도우와 마찬가지로 전역 범위 객체에 대한 참조입니다.JavaScript : 함수 로컬 범위를 객체로 참조하십시오.

예 :

function test(foo){ 
    var bar=1 
    //Now, can I access the object containing foo, bar, arguments and anything 
    //else within the local scope like this: 
    magicIdentifier.bar 
} 

다른 방법으로는, 사람이 사용자 정의 변수의 상단에있는 로컬 범위에서 무엇의 전체 목록이 있습니까?

배경 : 함수 호출 내에서 전역 범위로 완전히 이동하는 방법을 배우려는 중이므로 with 문은 농담이며 호출이 조금 더 잘 작동하지만 여전히 함수에서 선언 된 항목은 중단됩니다. 범위가 아니라 전 세계적인 범위에 있기 때문에 이러한 몇 가지 사례를 전 세계적인 범위에서 선언 하겠지만 그 내용은 내가 무엇인지 알고 있어야합니다. IE 함수 execScript는 완전한 시프트를 만들지 만 IE의 문제 만 해결합니다.

참고 : JavaScript를 동적으로로드하는 모든 사용자에게 setTimeout(code,1)은 글로벌 범위를 달성하는 간단한 효과적인 해킹이지만 즉시 실행되지는 않습니다.

+0

함수 내부에서'foo' 인수를 포함하는 객체에 액세스해야하는 이유는이 객체를 직접 인수로 전달하지 않는 이유는 무엇입니까? –

답변

13

없음은 함수 실행 컨텍스트변수 환경바인딩 객체의 실행 컨텍스트의 변수 개체를 참조 할 수있는 방법이 없다 (나는 이름이 기억 나지 않는) (즉, 그 일은 지금 [즉, 취소 선]이라 불리우며, 자세한 내용은 §10.3 of the specification입니다). arguments으로 제한된보기에만 액세스 할 수 있습니다 (실제로는 매우 제한적 임).

일반적으로이 작업을 수행하려고 할 때 원하는 모든 것을 개체에 넣은 다음이를 사용했습니다 (예 : 함수로 전달). 물론, 컨텍스트 내에서 생성 된 모든 함수는 컨텍스트를 "닫기"할 때 생성 된 범위의 모든 항목에 액세스 할 수 있습니다. more : Closures are not complicated.

+1

와우, 그 스펙은 정말 통증입니다. 어쨌든, 내가 말할 수있는 한, 매개 변수와 정의 된 지역을 제외한 유일한 지역 변수는 인수와 길이라는 것을 제안하는 것처럼 보입니다. 그걸 움직여야 해. 고마워. 저는 라이브러리를 만들고 있는데, 만들고있는 첫 번째 기능은 setInterval의 일관된 버전입니다. 이것이 바로이 기능입니다. 반짝이는 추상화 된 인터페이스를 제공하면 모든 것이 훨씬 복잡해집니다. – aaaaaaaaaaaa

+0

@eBusiness : 예, 가능합니다. :-) 함수 내에서 선언 된 명명 된 함수는 모두 잊어 버리지 말고, 범위 내 심볼도 잊지 마십시오. –

1

특정 버전의 넷스케이프는 찾고있는 것을 수행 한 arguments 개체에 마법 속성이 있습니다.

+0

'arguments'는 현재 함수에 전달 된 모든 인수를 포함하는 변수입니다. – nickf

+1

@nickf : 그 사실을 알고 있습니다. Netscape의 특정 버전에서는 변수 범위를 참조하는 특별한 proeprty가있었습니다. – SLaks

+1

@nickf : 처음에는 잘못 읽었지만 SLaks를 알고 두 번째 읽기를하고 그가 의미하는 바를 깨달았습니다. :-) –

-2

에있는 범위가 이므로 로컬 범위의 변수를 참조하는 데 키워드가 필요하지 않습니다.

+5

예, 저는 그가 그 (것)들 또는 무언가에 반복하기를 원한다고 생각합니다 ... – nickf

+1

현재 범위에 존재하는 모든 단일 변수를 반복합니까? Javascriptic (또는 "Pythonic"이라는 단어의 자바 스크립트 유사어)이 나에게 들리는 것은 아닙니다. –

+1

로컬 변수를 참조하는 객체가 없으면 Un-Javascriptic이 나에게 들립니다. 나는 그것을 필요로하지 않지만 그것이 존재할 것을 기대할 것입니다, 자바 스크립트는 거의 모든 것에 대한 객체를 가지고 있고 객체에 관한 것입니다. – Rolf

0

어때?

<script type="text/javascript"> 
    var test = { 
     bar : 1, 
     foo : function() { 
      alert(this.bar); 
     } 
    } 

    test.foo(); 
</script> 
+0

내 목표가 이상한 코드를 작성하는 것이었다면 좋은 해결책이었을 것입니다 :-) – aaaaaaaaaaaa

+0

Lol. 나는 당신이 단순한 클래스 구조를 생성 한 이래로 그것이 얼마나 이상한지를 보지 못했다. –

0

어떤 객체에 함수의 범위를 이동하려는 경우 당신은 당신의 경우에는 밑줄과 라이브러리 _.bind

사용할 수 있습니다

var fn = _.bind(function(){ 
    console.log(this == window) 
},window) 

fn() // true 
+2

그것은 함수 범위가 아니며, 그것은'this'입니다. – aaaaaaaaaaaa

6

나는이 알을 상당히 늦었고 아마 더 이상 관심이 없겠지만, 나는 이것의 타당성에 대해서도 관심이 있었기 때문에 다음을 사용하여 어떤 종류의 문제를 해결할 수 있어야한다.

16,는 실행 :

scope('testVar'); // 1 

는 폐쇄 내에서 변수를 반환합니다.그다지 좋지는 않지만 이론적으로는 객체에 랩핑 할 수 있습니다. 필요한 경우 일부 유효성 검사 및 getter 및 setter를 사용하는 것이 좋습니다.

편집 : 질문을 다시 읽은 후에는 범위 자체에 함수를 지정하지 않아도 액세스하려는 것으로 간주되므로 적용되지 않을 수 있습니다. 어쨌든 여기두고 갈께.

+1

나는 이것이 훌륭하다고 생각한다! –

관련 문제