2016-06-05 1 views
2

여기에 무엇이 누락 되었습니까? 이 예상대로 동작 :JavaScript var 키워드 : 클로저 내의 변수 값 재정의

var x = 1; 
(function(){ 
    // x === 1 
})(); 

그러나,

var x = 1; 
(function(){ 
    var x = x; 
    // x is undefined 
})(); 

내가 x는 1을해야한다고 생각합니다. var x = x은 할당되기 전에 x 값을 누크하는 것처럼 보입니다. 이거 버그 야? 이것은 매우 직관적이지 않습니다.

이 동작이 변경 되었습니까? 나는 과거에 like this을하는 것을 기억합니다.

참고로

:

var x = 1; 
(function(){ 
    var y = x; 
    // y === 1 
})(); 

그리고 :

var x = 1; 
(function(){ 
    x = x; 
    // x === 1 
})(); 
+0

일반적으로 var가 선언 된 곳은 함수의 맨 앞에 선언 된 것처럼 (할당 전에) 선언됩니다. – coyotte508

답변

4
var x = 1; 
(function(){ 
    var x = x; 
})(); 

가된다 : 어떤 코드가 실행되기 전에 변수 선언 (그리고 일반적으로 선언) 어딘가에 변수 선언 처리되므로

var x = 1; 
(function(){ 
    var x; 
    x = x; 
})(); 
+0

[this] (https://jsfiddle.net/4w23a967/)은 어떨까요? 귀하의 설명이 사실이라면 링크 된 바이올린은 효과가 있지만 그렇지 않은 것은 효과가 있습니다. – nicael

+1

@nicael 두 var 선언이 과제 위에 올리기. –

+0

자, 아마도 설명해야 할 것입니다. – nicael

-2

당신이 X를 만드는 일을 덮어, 그 자체를 참조하도록 설정 한 후 전역 변수로 X를 설정하는 것입니다 여기에 일을하고있다 = > x는 정의되지 않습니다.

+0

와우 무엇? 괜찮아 ... –

-1

var을 입력 할 때마다 새 변수를 재 할당합니다. 함수 내에서 x를 참조 할 때 위의 대입 문을 찾습니다. variable hoisting

function f(){ 
    var x = x; //this tries to reassign var x to undefined. 
} 
2

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/var

이 코드는 맨 위에 선언하는 것과 같습니다. 이것은 변수가 선언되기 전에 사용 된 것처럼 보일 수도 있음을 의미합니다. 이 동작은 "호이 스팅 (hoisting)"이라고 불리며, 변수 선언이 함수 또는 전역 코드의 맨 위로 이동 한 것처럼 보입니다. 함수 인수와

function() { 
    var x; 
    x = x; 
} 

예는 다른 당신을 그냥 : 당신이 코드가 예에서

var i,j,abc, d; 

//code 

처럼, 코드는 다음과 같이 변환 참조 왜 때때로 플러그인에서

이다 그 함수 인수 자체를 변경하면 var 선언은 무시됩니다. 스코프 변수가 let로 선언 된 경우

, 그것은 해당 범위의 시작 부분으로 이동하지 함수, 그래서이 코드는 작동합니다 :

var x = 1; 
(function(){ 
    var y = x; 
    { 
     let x = y; 
     console.log(x); 
    } 
})(); 

으로 지적

, 그것은 새로운 기능입니다 , 그래서 not supported everywhere.

그리고 마지막으로, 여기에 : 당신이 그것을 편집하는 경우, 그것은 또한 전역에서 편집 할 수 있습니다 있도록

var x = 1; 
(function(){ 
    x = x; 
    // x === 1 
})(); 

당신은 로컬 x를 선언하지 않습니다.

+0

http://caniuse.com/#search=let –

1

JavaScript에서 모든 변수는 전역 범위 또는 범위의 전역에서 선언 된 곳에서 전체적으로 기능을 선언했습니다. 예를 들어 :

이상한 프로그래밍 언어 디자인이지만이 코드는이 규칙 때문에 "정의되지 않음"을 인쇄합니다.