2012-12-14 6 views
0

제목에 대한 다른 게시물을 읽으려고했지만 아직 행운이 없습니다. 아래의 코드에서 왜 doesnt f2()가 f1()에 정의 된 var에 액세스 할 수 있는지 설명합니다. var "이름"이 f2() 함수의 전역 변수가 아닌가? var "name"을 f2()해서는 안됩니까?JavaScript의 로컬 및 전역 범위

function f1() { 
    var name = "david"; 
    function f2() { 
     document.writeln(name); 
    } 
    document.writeln(name); 
    }     

    f2(); // does not write out "david". 
+0

오류 콘솔을 확인하십시오. "undefined는 함수가 아닙니다"와 같은 메시지를보아야합니다. –

답변

8

f2()f1() 범위 내에서만 정의됩니다. 당신은 그것을 세계적으로 호출 할 수 없다.

+2

DING DING DING'+ 1' – Neal

+0

니스와 다이렉트. –

+0

괜찮아. 방금 f1()에서 f2()를 추가하고 생각했던 것처럼 작동합니다. 감사. – DEdesigns57

0

당신은 Javascript Closure를 읽을 필요가있다.

다음은 내부 함수에서 외부 함수의 변수에 액세스하는 방법을 보여주는 스 니펫의 버전입니다 (내부 함수를 전역으로 호출하려는 경우).

function f1() 
{ 
    var name = "david"; 
    return function() 
    { 
     console.log(name); 
    } 
} 
var f2 = f1(); 
f2(); 
+0

"올바른"것이 무엇인지 어떻게 알 수 있습니까? – Neal

+0

@Neal 음, 맞습니다. 그러나 나는 그의 코드의 의도를 짐작하고있다. – bits

+0

나는 당신이 잘못 생각했다고 생각합니다. – Mathletics

1

자바 스크립트는 범위가 스코프이며 범위는 블로킹되지 않습니다. 함수는 부모의 함수 변수에 액세스 할 수 있지만 그 안에있는 함수에 정의 된 변수에는 액세스 할 수 없습니다. f1에서 f2를 반환하고 그 방법으로 호출 할 수 있습니다.

 function f1() { 
     var name = "david"; 

     document.writeln(name); 

     return f2 

     function f2() { 
      document.writeln(name); 
     } 

     } 

var f2 = f1(); 
f2(); 
+0

올바른 문장은 문제와 직교합니다. 블록 스콥 일지라도 여전히 똑같은 행동을합니다. 오류는 "함수가 마술처럼 전역 영역에 놓여 있지 않기 때문에"입니다. 다른 주제. 나머지는 그것이 "노출"될 수있는 방법을 보여주기 위해 계속되지만, 다른 뉘앙스를 보여주는 복잡한 방식으로 나타납니다. 직접하십시오. 또한, 이것은 원하지 않을 수도있는'f1'의 실행에 "david"를 표시 할 것입니다. –