JavaScriptμ—μ„œ ES λž€?

ECMASCRIPT의 μ•½μ–΄λ₯Ό λœ»ν•˜λ©°, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν‘œμ€€, κ·œκ²©μ„ λ‚˜νƒ€λ‚΄λŠ” μš©μ–΄μ΄λ‹€.

 

λͺ¨λ“  λΈŒλΌμš°μ €μ—μ„œ λ™μž‘ν•  수 μžˆλŠ” ν‘œμ€€ν™”λœ μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ ν•„μš”ν•΄μ§€λ©΄μ„œ

λΉ„μ˜λ¦¬ ν‘œμ€€ν™” 기ꡬ인 ECMA 인터넀셔널에 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν‘œμ€€ν™”λ₯Ό μš”μ²­ν•˜μ˜€λ‹€.

 

ES5 λŠ” 2009년도에 HTML5와 ν•¨κ»˜ μΆœμ—°ν•œ ν‘œμ€€ 사양이며,

ES6λŠ” 2015년에 λ²„μ „μ—…μ„ν•˜μ—¬ μΆœμ‹œν•œ 버전이닀. 

ES6 μ΄ν›„λ‘œλ„ 맀년 μ—…λ°μ΄νŠΈκ°€ 되고 있고, 이후λ₯Ό 'λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ'라고 λΆ€λ₯Έλ‹€.

 

μ•„λž˜μ—λŠ” ES6에 ν¬ν•¨λœ

let, const ν‚€μ›Œλ“œ /  ν™”μ‚΄ν‘œ ν•¨μˆ˜ / 클래슀 / λͺ¨λ“ˆ 닀루고 μžˆλ‹€.

 

 


 

 

let, const ν‚€μ›Œλ“œ

ES5

ES5의 λ³€μˆ˜ μ„ μ–Έ 방법은 varκ°€ μœ μΌν•˜λ‹€.

 

var :  μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”κ°€ λ™μ‹œμ— μ‹€ν–‰ 

 

단점: 

ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„ 지원 → μ§€μ—­λ³€μˆ˜λ₯Ό μ „μ—­λ³€μˆ˜λ‘œ μ‚¬μš©λ‚¨λ°œ

varν‚€μ›Œλ“œ μƒλž΅ ν—ˆμš© → 암묡적 μ „μ—­λ³€μˆ˜ μ–‘μ‚°

λ³€μˆ˜ 쀑볡 μ„ μ–Έ ν—ˆμš© λ³€μˆ˜κ°’μ˜ μ˜λ„μΉ˜ μ•Šμ€ λ³€κ²½

λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…  → μ„ μ–Έν•˜κΈ° 이전에 μ°Έμ‘°

 

 

ES6

 var ν‚€μ›Œλ“œμ˜ 단점을 λ³΄μ™„ν•˜κΈ°μœ„ν•΄

letκ³Ό const ν‚€μ›Œλ“œκ°€ λ„μž…λ˜μ—ˆλ‹€. 

 

const : μƒμˆ˜(λ³€ν•˜μ§€ μ•ŠλŠ” κ°’, μž¬ν• λ‹Ή x)

let : μž¬ν• λ‹Ήμ΄ κ°€λŠ₯ν•œ κ°’

 

블둝 레벨 μŠ€μ½”ν”„ μ§€μ—­λ³€μˆ˜{ } μ—μ„œ μ‚¬μš©λœ λ³€μˆ˜λŠ” μ½”λ“œ λΈ”λ‘œλ‚΄μ—μ„œλ§Œ 유효

λ³€μˆ˜ 쀑볡 μ„ μ–Έ κΈˆμ§€ →  쀑볡 μ„ μ–Έμ‹œ, λ¬Έλ²•μ—λŸ¬κ°€ λ°œμƒ

ν˜Έμ΄μŠ€νŒ… λ³€μˆ˜ μ„ μ–Έ μ΄μ „μ—λŠ” μ°Έμ‘°ν•  수 μ—†λ‹€. 

 

λ³€μˆ˜ μ„ μ–Έμ—λŠ” 기본적으둜 constλ₯Ό μ‚¬μš©ν•˜κ³ , 

let은 μž¬ν• λ‹Ήμ΄ ν•„μš”ν•œ 경웨 ν•œμ •ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€. 

 

μ „μ—­ λ³€μˆ˜ (Global scope)
μ „μ—­μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜μ΄λ©°, μ–΄λ””μ—μ„œλ“ μ§€ μ°Έμ‘°ν•  수 μžˆλ‹€. 

지역 λ³€μˆ˜ (Local scope of Function-level scope)
지역(ν•¨μˆ˜) λ‚΄μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜μ΄λ©°, κ·Έ 지역과 κ·Έμ§€μ—­μ˜ ν•˜λΆ€μ§€μ—­μ—μ„œλ§Œ μ°Έμ‘°ν•  수 μžˆλ‹€.
ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„ (Function-level scope) 
ν•¨μˆ˜ λ‚΄μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λŠ” ν•¨μˆ˜ λ‚΄μ—μ„œλ§Œ 유효, ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œλŠ” μ°Έμ‘°ν•  수 μ—†λ‹€. 
즉, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ„ μ–Έλ³€μˆ˜λŠ” μ§€μ—­λ³€μˆ˜ / ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ „μ—­  λ³€μˆ˜

블둝 레벨 μŠ€μ½”ν”„ (Block-level scope)
λͺ¨λ“  μ½”λ“œ 블둝(ν•¨μˆ˜ ifλ¬Έ, forλ¬Έ, whileλ¬Έ, try/catch λ¬Έ λ“±)λ‚΄μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μ½”λ“œ 뢈둝 λ‚΄μ—μ„œλ§Œ 유효, 
μ½”λ“œ 블둝 μ™ΈλΆ€μ—μ„œλŠ” 

 

 

 

ν™”μ‚΄ν‘œ ν•¨μˆ˜(Arrow function)의 μ„ μ–Έ

 

ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” functionν‚€μ›Œλ“œ λŒ€μ‹  (=>)λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€.

// λ§€κ°œλ³€μˆ˜ 지정 방법
    () => { ... } // λ§€κ°œλ³€μˆ˜κ°€ 없을 경우
     x => { ... } // λ§€κ°œλ³€μˆ˜κ°€ ν•œ 개인 경우, μ†Œκ΄„ν˜Έλ₯Ό μƒλž΅ν•  수 μžˆλ‹€.
(x, y) => { ... } // λ§€κ°œλ³€μˆ˜κ°€ μ—¬λŸ¬ 개인 경우, μ†Œκ΄„ν˜Έλ₯Ό μƒλž΅ν•  수 μ—†λ‹€.

 

ES5보닀  ES6의 ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” 쒀더 κ°„κ²°ν•˜κ²Œ ν‘œν˜„λœλ‹€.

// ES5
var pow = function (x) { return x * x; };
console.log(pow(10)); // 100

// ES6
const pow = x => x * x;
console.log(pow(10)); // 100

기쑴의 ν•¨μˆ˜μ™€ this 바인딩이 λ‹€λ₯΄λ©°,

Lexical thisλ₯Ό μ§€μ›ν•˜λ―€λ‘œ μ½œλ°±ν•¨μˆ˜λ‘œ μ‚¬μš©ν•˜κΈ° νŽΈλ¦¬ν•˜λ‹€.

(이 뢀뢄은 μΆ”κ°€μ μœΌλ‘œ 곡뢀가 ν•„μš”ν•  것같닀.)

 

 

 

클래슀(Class)

ES5

μƒμ„±μž ν•¨μˆ˜μ™€ ν”„λ‘œν† νƒ€μž…, ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜μ—¬

객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ κ΅¬ν˜„ν•˜μ˜€λ‹€.

 

// ES5
var Person = (function () {
  // Constructor
  function Person(name) {
    this._name = name;
  }

  // public method
  Person.prototype.sayHi = function () {
    console.log('Hi! ' + this._name);
  };

  // return constructor
  return Person;
}());

var me = new Person('Lee');
me.sayHi(); // Hi! Lee.

console.log(me instanceof Person); // true

 

 

ES6

κΈ°μ‘΄ 방식보닀 λ‹¨μˆœλͺ…λ£Œν•œ μƒˆλ‘œμš΄ λ¬Έλ²•μœΌλ‘œ Classν•¨μˆ˜κ°€ μΆ”κ°€ λ˜μ—ˆλ‹€.

 

// 클래슀 μ„ μ–Έλ¬Έ
class Person {
  // constructor(μƒμ„±μž)
  constructor(name) {
    this._name = name;
  }

  sayHi() {
    console.log(`Hi! ${this._name}`);
  }
}

// μΈμŠ€ν„΄μŠ€ 생성
const me = new Person('Lee');
me.sayHi(); // Hi! Lee

console.log(me instanceof Person); // true

(λ””ν…ŒμΌν•œ λ‚΄μš©μ€ μΆ”κ°€ 곡뢀가 ν•„μš”ν• κ²ƒκ°™λ‹€.)

 

 

 

λͺ¨λ“ˆ (Module)

λͺ¨λ“ˆμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν•˜λŠ” κ°œλ³„μ  μš”μ†Œλ‘œμ„œ μž¬μ‚¬μš©μ΄ κ°€λŠ₯ν•œ μ½”λ“œ 쑰각을 λ§ν•œλ‹€. 

λͺ¨λ“ˆμ€ μ„ΈλΆ€ 사항을 μΊ‘μŠν™”ν•˜κ³  κ³΅κ°œκ°€ ν•„μš”ν•œ APIλ§Œμ„ 외뢀에 λ…ΈμΆœν•œλ‹€.

 

λͺ¨λ“ˆμ€ νŒŒμΌλ‹¨μœ„λ‘œ λΆ„λ¦¬λ˜μ–΄ 있으며 ν•„μš”μ— 따라 λͺ¨λ“ˆμ„ λ‘œλ“œν•˜μ—¬ μž¬μ‚¬μš©ν•œλ‹€. 

 

script νƒœκ·Έμ— type="module" 을 μΆ”κ°€ν•˜λ©΄ λͺ¨λ“ˆλ‘œμ„œ λ™μž‘ν•œλ‹€. 

ES6 λͺ¨λ“ˆμ˜ 파일 ν™•μž₯μžλŠ” λͺ¨λ“ˆμž„을 λͺ…ν™•ν•˜κΈ° μœ„ν•΄ mjsλ₯Ό μ‚¬μš©ν•˜λ„λ‘ ꢌμž₯ν•œλ‹€.

<script type="module" src="lib.mjs"></script>
<script type="module" src="app.mjs"></script>

 

λͺ¨λ“ˆμ€ λͺ¨λ“ˆ μŠ€μ½”ν”„λ₯Ό 가진닀. 

λͺ¨λ“ˆ λ‚΄μ—μ„œ var ν‚€μ›λ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” 더이상 μ „μ—­ λ³€μˆ˜κ°€ μ•„λ‹ˆλ©°

window 객체 ν”„λ‘œνΌλ””λ„ μ•„λ‹ˆλ‹€.

// foo.mjs
var x = 'foo';

console.log(x); // foo
// λ³€μˆ˜ xλŠ” μ „μ—­ λ³€μˆ˜κ°€ μ•„λ‹ˆλ©° window 객체의 ν”„λ‘œνΌν‹°λ„ μ•„λ‹ˆλ‹€.
console.log(window.x); // undefined
// bar.mjs
// λ³€μˆ˜ xλŠ” foo.mjsμ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜ x와 μŠ€μ½”ν”„κ°€ λ‹€λ₯Έ λ³€μˆ˜μ΄λ‹€.
var x = 'bar';

console.log(x); // bar
// λ³€μˆ˜ xλŠ” μ „μ—­ λ³€μˆ˜κ°€ μ•„λ‹ˆλ©° window 객체의 ν”„λ‘œνΌν‹°λ„ μ•„λ‹ˆλ‹€.
console.log(window.x); // undefined
<!DOCTYPE html>
<html>
<body>
  <script type="module" src="foo.mjs"></script>
  <script type="module" src="bar.mjs"></script>
</body>
</html>

 

 

Export: 외뢀에 κ³΅κ°œν•˜μ—¬ λ‹€λ₯Έ λͺ¨λ“ˆλ“€μ΄ μ°Έμ‘°ν•  수 μžˆκ²Œν•œλ‹€.

// lib.mjs
const pi = Math.PI;

function square(x) {
  return x * x;
}

class Person {
  constructor(name) {
    this.name = name;
  }
}

// λ³€μˆ˜, ν•¨μˆ˜ 클래슀λ₯Ό ν•˜λ‚˜μ˜ 객체둜 κ΅¬μ„±ν•˜μ—¬ 곡개
export { pi, square, Person };

 

 

Import: λͺ¨λ“ˆμ—μ„œ κ³΅κ°œν•œ (export)ν•œ λŒ€μƒμ„ λ‘œλ“œν•˜λ €λ©΄ import ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

μ•„λž˜μ˜ import 3가지 방식을 μ°Έκ³ ν•  수 μžˆλ‹€.

// app.mjs
// 같은 폴더 λ‚΄μ˜ lib.mjs λͺ¨λ“ˆμ„ λ‘œλ“œ.
// lib.mjs λͺ¨λ“ˆμ΄ exportν•œ μ‹λ³„μžλ‘œ importν•œλ‹€.
// ES6 λͺ¨λ“ˆμ˜ 파일 ν™•μž₯자λ₯Ό μƒλž΅ν•  수 μ—†λ‹€.
import { pi, square, Person } from './lib.mjs';                      // import 첫번째 방식
import * as lib from './lib.mjs';                                    // import λ‘λ²ˆμ§Έ 방식
import { pi as PI, square as sq, Person as P } from './lib.mjs';     // import μ„Έλ²ˆμ§Έ 방식

console.log(pi);         // 3.141592653589793
console.log(square(10)); // 100
console.log(new Person('Lee')); // Person { name: 'Lee' }

 

 

<참고용>

lib.mjs / app.mjs / html μ—μ„œ import와 export λ™μž‘ μ‚¬μš©λ°©λ²• 

// lib.mjs
export default x => x * x;
// app.mjs
// λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œλŠ” λͺ¨λ“ˆμ˜ 파일 ν™•μž₯자λ₯Ό μƒλž΅ν•  수 μ—†λ‹€.
// λͺ¨λ“ˆμ˜ 파일 ν™•μž₯μžλŠ” .mjsλ₯Ό ꢌμž₯ν•œλ‹€.
import square from './lib.mjs';

console.log(square(10)); // 100
<!DOCTYPE html>
<html>
<body>
  <script type="module" src="./lib.js"></script>
  <script type="module" src="./app.js"></script>
</body>
</html>

 

+ Recent posts