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>

 

 

- '์—…๋ฐ์ดํŠธ'๋ฅผ ๋ˆŒ๋ €์„๋•Œ, ์™ธ๋ถ€์˜ ์ž๋ฃŒ๋ฅผ ์ •๋ฆฌํ•ด์„œ ๋ณด์—ฌ์ฃผ๊ธฐ
- ํ•œ๋ฒˆ ๋” '์—…๋ฐ์ดํŠธ'๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ, ์ด์ „์ž๋ฃŒ๋Š” ์‚ญ์ œ๋˜๊ณ  ๋‹ค์‹œ ๋ณด์—ฌ์ฃผ๊ธฐ

 

 

    <script>
        function q1() {
            $('#names-q1').empty()
            $.ajax({
                type: "GET",
                url: "http://spartacodingclub.shop/sparta_api/seoulair",
                data: {},
                success: function (response) {
                    let rows = response["RealtimeCityAir"]["row"]
                    for (let i = 0; i < rows.length; i++) {
                        let gu_name = rows[i]["MSRSTE_NM"]
                        let gu_mise = rows[i]['IDEX_MVL']

                        let temp_html = ``

                        if (gu_mise > 60) {
                            temp_html = `<li class="bad">${gu_name} : ${gu_mise}</li>`
                        } else {
                            temp_html = `<li> ${gu_name} : ${gu_mise}</li>`
                        }

                        $('#names-q1').append(temp_html)
                    }
                }
            })
        }
    </script>

+ Recent posts