var vs let
* 공통
- 자바스크립트에서 변수선언은 코드가 실행되기 전에 처리된다.
- 스크립트단에는 선언한 변수를 또 선언한다는 의미가 없다. 즉, var a; var a; 가능. 스크립트에서 자동으로 var a; 하나로 해석하기 때문이다. 단, let에서는 오류가 뜬다. 규칙은 아래에서 설명한다.
- 자바스크립트에서 변수선언은 var, let, const(상수) 3가지가 있다.
- var
1) function x() { a = 1; var b = 2; }
// a는 window로 전역변수로 생성되고, b는 x함수의 지역변수로 생성.
여기서 x함수는 b를 실행하는 것이 context이다.
2) function x() { var a = b = 1; }
// a는 x의 지역변수이지만 b는 x가 아니라 window로 생성. 결과는 1로 동일.
하지만 { var a, b = 1, a = b; }라고 했다면 a와 b 둘다 지역변수로 선언된다.
>>> 함수단위로 선언된다. 선언된 곳 기준으로 {}로 묶인 최상위 함수 바로 밑에 생성된다.
- let
>>> '{}' 단위로 선언된다. es6부터 나오기 시작했다.
참고 : http://es6-features.org/#Constants
1) function a() { let x = 1; if(true) { x = 4;} }
// x는 1이다. 하지만 if구문에서 let x로 선언했다면 x는 4이다.
2)
window.onload = function a() {
var list = document.getElementById("list");
for (var i = 1; i <= 5; i++) {
var item = document.createElement("LI");
item.appendChild(document.createTextNode("Item " + i));
let j = i;
item.onclick = function (ev) {// window.onload는 JQuery의 $(document).ready()와 같다. 이게 없다면 getElememtById는 코드를 순차적으로 읽어가며 해석하므로 list가 비게 되어버린다.
console.log("Item " + j + " is clicked.");
};
list.appendChild(item);
}
}
// let은 {}단위로 선언되므로 위 코드에서 j는 for문 i=1, i=2...를 각각 가리키게 됨. let을 var로 고치면 j는 계속 5가 된다. var는 함수단위로 선언되므로 위 코드에서 가장 최상위 함수인 a의 바로 아래에서 먼저 선언되기 때문이다. 즉, 아래와 같아진다.
.... function a() { var j; ..... for(var i = 1; i <= 5; i++) { var j = i; .... };
// onclick 함수부분은 이벤트구문이다. 따라서 i=1, i=2... 각각에 가지고 있게 된다.
* let 사용규칙
1) 블럭({})안에서 같은 변수를 사용할 수 없다. 즉, let a; let a; 불가능.
2) 선언하기 전에는 사용이 불가하지만 호이스팅 개념은 있다.
※ 호이스팅이란?
코드상에서 변수선언 구문들이 가장 먼저 실행되는 것. (!=스코프체인)
(아래의 Mozilla Developer Network에 설명된 변수 호이스팅 참조)
Variable hoisting
Another unusual thing about variables in JavaScript is that you can refer to a variable declared later, without getting an exception. This concept is known as hoisting; variables in JavaScript are in a sense "hoisted" or lifted to the top of the function or statement. However, variables that are hoisted will return a value of
>>> 변수들이 함수나 구문의 최상위로 "올려진다". 하지만 아래 예시처럼 호이스팅된 변수는 undefined를 반환한다. example 2에서는 전역으로 var myvar가 선언되기는 했지만, 함수 안에서 var myvar;로 올려지므로 이 또한 undefined반환. 이를 통해 호이스팅은 일단 변수정의부만 위로 올려짐을 알 수 있다.
undefined
. So even if you declare and initialize after you use or refer to this variable, it will still return undefined.>>> 변수들이 함수나 구문의 최상위로 "올려진다". 하지만 아래 예시처럼 호이스팅된 변수는 undefined를 반환한다. example 2에서는 전역으로 var myvar가 선언되기는 했지만, 함수 안에서 var myvar;로 올려지므로 이 또한 undefined반환. 이를 통해 호이스팅은 일단 변수정의부만 위로 올려짐을 알 수 있다.
/**
* Example 1
*/
console.log(x === undefined); // true
var x = 3;
/**
* Example 2
*/
// will return a value of undefined
var myvar = "my value";
(function() {
console.log(myvar); // undefined
var myvar = "local value";
})();
The above examples will be interpreted the same as:
/**
* Example 1
*/
var x;
console.log(x === undefined); // true
x = 3;
/**
* Example 2
*/
var myvar = "my value";
(function() {
var myvar;
console.log(myvar); // undefined
myvar = "local value";
})();
댓글 없음:
댓글 쓰기