2012-05-17 2 views
2

bar의 두 번째 console.log에는 어떤 현상이 발생합니까? "Andy"가 아니거나 참조 오류가 발생하면 안됩니까? 또한 foo이 정의되지 않은 이유는 무엇입니까?자바 스크립트 변수 유효 범위가 예상치 못한 결과입니다.

크롬 사용. 위의

// lexical scope example 
var bar = "Andy"; 
try { 
    console.log(bar); // Andy 
    (function() { 
     console.log(bar); // undefined! 
     var bar = "B", 
      foo = "Last Name"; 
     console.log(bar); // B 
     console.log(foo); // Last Name 
    })(); 
    console.log(bar); // B 
    console.log(foo); // Reference Error 
} catch (e) { 
    console.log(e); 
}​ 

JSFiddle : 가 (function() {로 시작하는 라인이 줄을 둘러싸는 범위/폐쇄를 생성 http://jsfiddle.net/2D9fj/3/

+0

http://stackoverflow.com/questions/1552941/variables-in-anonymous-functions-can-someone-explain-the-following에 관련? – j08691

답변

0

, 푸 바르 그 값 범위 밖에 사용할 수 없습니다/폐쇄

1

var에 선언 코드가 파싱 된 후 게양됩니다. (많은 개발자들이 맨 위에 모든 코드를 정의하는 이유입니다)

// lexical scope example 
var bar = "Andy"; 
try { 
    console.log(bar); // Andy 
    (function() { 
     var bar, foo; 
     console.log(bar); // undefined! 
     bar = "B"; 
     foo = "Last Name"; 
     console.log(bar); // B 
     console.log(foo); // Last Name 
    })(); 
    console.log(bar); // B 
    console.log(foo); // Reference Error 
} catch (e) { 
    console.log(e); 
}​ 
0

Andrew의 대답은 정확하지만 추가 코드가없는 권상 개념을 보여주는 예를 제공하면 유용 할 것입니다.

// this: 
function foo() { 
    console.log(x); 
    var x = 1; 
} 

//is actually interpreted like this: 
function foo() { 
    var x; 
    console.log(x);// undefined 
    x = 1; 
} 

은 또한 폐쇄는이 문제와 관련이 있지만 너무 많은 그것은 더 열심히 용이 한 오류를 식별 할 수있다.

(function parent() { 
    // x declared and assigned in parent scope 
    var x = 2; 

    function foo() { 
     console.log(x); // 2 (closed around parent scope) 
    } 

    function bar() { 
     console.log(x); // undefined (bar scope, x declaration is hoisted, but not defined yet) 
     var x = 1; 
    } 
    function baz() { 
     var x = 3; 
     console.log(x); // 3 (baz scope, defined) 
    } 
    //run 
    foo(); 
    bar(); 
    baz(); 
}());