2010-05-04 8 views
4

범위를 벗어난 변수를 변경할 수있는 방법이 있습니까? 나는 일반적으로 당신이 할 수 없다는 것을 알고 있지만, 트릭이나 오버라이드가 있는지 궁금합니다. 가상의 시나리오에서 또한 인 setInterval을 기능에 사용되는 변수를 수정 될범위 밖의 변수 변경?

:

function blah(){ 
var a = 1 
} 
a = 2; 
alert(blah()); 

EDIT (해명) : 예를 들어, 다음과 같은 일을 할 수있는 방법이있다 범위 및 un-editable 이전 javascript 파일에서. 꽤 엉뚱한 시나리오지만, 제가 물어볼 계획입니다.

답변

3

아니요 트릭이나 오버라이드 없음. 두 곳 모두 동일한 범위에서 변수를 볼 수 있도록 계획해야합니다.

범위와 관련하여 생각할 수있는 유일한 트릭은 브라우저에서 window을 사용하여 전역 개체에 도달하는 것입니다. 이것은 "숨겨진"변수, 즉 범위 내에 있지만 이름이 지역 변수 (또는 범위 체인에서 가까운 다른 변수)에 의해 추월 된 변수에 도달하는 데 도움이 될 수 있습니다.

클로저와 클래스는 범위와 함께 다른 트릭을 제공 할 수 있지만 범위 지정 규칙을 완전히 무시할 수는 없습니다.

+0

아이디어를 제공해 주셔서 감사합니다. 다른 사람들이 어떤 트릭을 알고있는 경우를 대비하여 잠시 동안 질문을하게 할 것입니다. 그렇지 않으면 정답입니다. 감사. – Matrym

2

외부에서 액세스 할 수있는 변수가 필요한 경우 외부에서 선언하기 만하면됩니다. 왜 그렇게해야하는지 알 수 없습니다.

이제 뭔가를 배우려고하기 때문에이 질문을하면 좋을 것입니다.

var a = 0; 

function blah() { 
    a = 1; 
    return a; 
} 
a = 2; 

alert(blah()); 
+2

포인트를 볼 수 있습니다 당신이 그것을 깨달은 것처럼 보입니다.) – Matrym

0
가 함수 자체 전에 선언하는 경우, 그 범위 밖에 선언 된 변수에 액세스 할 수 있습니다

기능 :

var a = 0; 
function blah() { 
    a = 1; 
} 
a = 2; 
alert(blah()); 

주 기능 내부 var a의 사용 로컬 변수를 선언 명명 된; 여기에서 키워드를 생략하면 바깥 쪽 범위에 선언 된대로 a이 숨겨집니다! 이는 다르게 동작 (

function bleh() { 
    var a; 
    function blah(){ 
    a = 1 
    } 
    a = 2; 
    alert(blah()); 
} 

또는 당신은 리턴으로 주위를 전달할 수 :

var a; 
function blah(){ 
a = 1 
} 
a = 2; 
alert(blah()); 

또는 폐쇄를 사용

+0

죄송합니다, 나는'return' 키워드를 놓쳤습니다. –

+0

그들은 함수 정의 전에 선언 할 필요가 없습니다. –

0

아니, 작동하지 않습니다,하지만 당신은 세계를 사용할 수 있습니다 하지만 아마도 당신이 원하는 것입니다 :

function blah(a){ 
a = 1 
return a; 
} 
a = 2; 
alert(blah(a)); 
+0

을 잊어 버린 경우 – Thielicious

1

당신은 물론, 함수에서 값을 반환 할 수 있습니다

function blah() { 
    var a=1; 
    return a; 
} 

하지만 그건 당신이 생각했던 아주 게 아니에요 가정합니다. 함수 호출은 지역 변수에 대한 클로저를 생성하기 때문에 클로저가 생성되면 일반적으로 값을 수정할 수 없습니다.

개체는 참조 값이기 때문에 다소 다릅니다.당신이 콘솔 객체의 환경에서 실행하면

function blah1(v) { 
    setInterval(function() { 
     console.log("blah1 "+v); 
    }, 500); 
} 
function blah2(v) { 
    setInterval(function() { 
     console.log("blah2 "+v.a); 
    }, 500); 
} 

var a = 1; 
var b = {a: 1}; 
blah1(a); 
blah2(b); 
setInterval(function() { 
    a++; 
}, 2000); 
setInterval(function() { 
    b.a++; 
}, 2000); 

, 그 2 초 후 다시 blah2 변화를보고 있지만, 단지 V에 ​​대해 동일한 값을 사용하여 blah1 간다 값.