2014-11-12 5 views
0
function globalFunc1() { 
    console.log(hello); 
} 

function globalFunc2() { 
    var hello = 'hello'; 
    globalFunc1(); // expected to print "hello" but `hello` is undefined instead 
} 

globalFunc2(); 

내부 변수를 globalFunc1()으로 전달하지 않고도 가능합니까? 나는 현재 내가 원하는 것을 얻기 위해 다음과 같은 해킹을 사용하고있다.하지만 너무 익살스럽고 우아하지 않다.전역 적으로 정의 된 함수의 액세스 함수 범위 체인

function globalFunc2() { 
    var hello = 'hello'; 
    eval('(' + globalFunc1.toString() + ')()'); 
} 

편집 :

실제로 내가하고 원하는 것을 달성하기 위해 Function.prototype.bind, .call 또는 .apply에 비슷 자바 스크립트에서 일부 기능을 찾고 있어요.

function checker() { 
    if (someVar == 'some value') { 
    /* ... */ 
    } 
} 

setTimeout(function() { 
    var someVar = 'some value'; 
    /* ... */ 
    checker(); 
}, 1000); 
+0

아니요, 가능하지 않습니다. – zerkms

답변

2

당신은 globalFunc2 내부 globalFunc1 이동할 수있는, 그래서 후자의 내부 변수에 액세스 할 수 있지만, 외부에서 호출 할 수 있도록 글로벌 변수에 할당 :

내가 뭐하는 거지 정교하게하려면 다음은

function globalFunc2() { 

    window.globalFunc1 = function() { 
    console.log(hello); 
    }; 

    var hello = 'hello'; 
    globalFunc1(); // will print "hello" 
} 

globalFunc1(); // will print "hello" 

globalFunc1globalFunc2 내에 정의 등의 고정이 경우 hello의 변수에 대한 액세스를 갖는다. 그러나 그 자체는 전역 변수이므로 외부에서 액세스 할 수 있습니다.

질문에 대한 질문에서 전역 적으로 정의 된 함수 (아마도 "선언 된"이라고 말해야 함) 함수가 함수를 가리키는 경우에만 전역 적으로 정의 된 함수에서 함수 범위 체인에 액세스 할 수 있습니다 은 다른 기능의 범위 안에 있습니다.

무엇을 하든지간에 eval 것을 수행하지 마십시오. 당신이 본질적으로하고있는 것은 어휘 적으로 그것을 복사하여 함수를 정의 (그리고 나서 즉시 실행)하는 것입니다. 그렇게하는 대신, 위와 같이 시작하는 함수를 작성하는 것이 어떻겠습니까?

+0

입력 해 주셔서 감사합니다. 'globalFunc2'는 콜백의 일종으로 여러 번 실행되기 때문에 동일한 함수 (예 :'globalFunc1')를 여러 번 정의하고 싶지는 않습니다. 그래도 당분간 당신의 접근 방식을 취할 것입니다. (그에 따라 업데이트되는 질문) – cychoi

관련 문제