λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ κ°œλ°œμžκ°€ μ•Œμ•„μ•Ό ν•˜λŠ” 33가지 κ°œλ…

 

GitHub - yjs03057/33-js-concepts: λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ κ°œλ°œμžκ°€ μ•Œμ•„μ•Ό ν•˜λŠ” 33가지 κ°œλ…

λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ κ°œλ°œμžκ°€ μ•Œμ•„μ•Ό ν•˜λŠ” 33가지 κ°œλ…. Contribute to yjs03057/33-js-concepts development by creating an account on GitHub.

github.com

IIFE(Immediately Invoked Function Expression, μ¦‰μ‹œ μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜ ν‘œν˜„μ‹)

(function () {
    statements
})();
  • IIFEλž€? ν•¨μˆ˜μ˜ μ„ μ–Έκ³Ό λ™μ‹œμ— μ¦‰μ‹œ μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. μΌμ’…μ˜ κ΄„ν˜Έλ‘œ λ‘˜λŸ¬μ‹ΈμΈ 읡λͺ… ν•¨μˆ˜μž…λ‹ˆλ‹€.
  • 읡λͺ… ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  경우 였λ₯˜κ°€ λ°œμƒλ©λ‹ˆλ‹€.
function() {
  console.log('my name is eun!');
} // Uncaught SyntaxError: Function statements require a function name
  • 읡λͺ… ν•¨μˆ˜λ₯Ό κ΄„ν˜Έλ‘œ λ‘˜λŸ¬μ‹Έκ²Œ 되면 읡λͺ… ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜κ°€ λ©λ‹ˆλ‹€.
(function() {
  console.log('my name is eun!');
}) /* ƒ () {
  console.log('my name is eun!');
} */
// ν•¨μˆ˜λ₯Ό κ·ΈλŒ€λ‘œ λ±‰μ–΄λƒ…λ‹ˆλ‹€.
  • λ°˜ν™˜λœ ν•¨μˆ˜λ₯Ό λ°”λ‘œ μ‹€ν–‰ν•˜κ³  μ‹Άλ‹€λ©΄, 뒀에 κ΄„ν˜Έλ₯Ό ν•˜λ‚˜ 더 뢙이면 λ©λ‹ˆλ‹€.
(function() {
  console.log('my name is eun!');
})();

IIFE의 ν•„μš”μ„±

  • λΆˆν•„μš”ν•œ λ³€μˆ˜λ₯Ό μΆ”κ°€ν•΄ μ „μ—­ μŠ€μ½”ν”„κ°€ μ§€μ €λΆ„ν•΄μ§€λŠ” 것을 λ°©μ§€ν•©λ‹ˆλ‹€.
  • IIFE λ‚΄λΆ€λ‘œ λ‹€λ₯Έ λ³€μˆ˜λ“€μ˜ μ ‘κ·Ό λ°©μ§€ν•©λ‹ˆλ‹€.
// IIFE λ‚΄λΆ€μ—μ„œ μ •μ˜λœ λ³€μˆ˜λŠ” μ™ΈλΆ€ λ²”μœ„μ—μ„œ 접근이 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.
(function () {
    var myName = "eun";
})();

myName // "Uncaught ReferenceError: myName is not defined"
  • IIFEλ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ IIFE μžμ²΄λŠ” μ €μž₯λ˜μ§€ μ•Šκ³ , ν•¨μˆ˜κ°€ μ‹€ν–‰λœ 결과만 μ €μž₯λ©λ‹ˆλ‹€.
var result = (function () {
    var name = "eun";
    return name;
})();
// μ¦‰μ‹œ κ²°κ³Όλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
result; // "eun"

λͺ¨λ“ˆ(Modules)

  • λͺ¨λ“ˆμ΄λž€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν•˜λŠ” κ°œλ³„μ μΈ μš”μ†Œλ‘œμ„œ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œ 쑰각을 μΌμ»«μŠ΅λ‹ˆλ‹€. λͺ¨λ“ˆμ€ μ„ΈλΆ€ 사항을 μΊ‘μŠν™”ν•˜κ³  κ³΅κ°œκ°€ ν•„μš”ν•œ APIλ§Œμ„ 외뢀에 λ…ΈμΆœν•©λ‹ˆλ‹€.
  • κ°œλ°œλ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 크기가 점차 μ»€μ§€λ©΄μ„œ νŒŒμΌμ„ μ—¬λŸ¬ 개둜 λΆ„λ¦¬ν•˜κ²Œ λ©λ‹ˆλ‹€. μ΄λ•Œ λΆ„λ¦¬λœ 파일 각각을 λͺ¨λ“ˆμ΄λΌκ³  λΆ€λ¦…λ‹ˆλ‹€.
  • λ³Έλ”” ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œμΈ JavascriptλŠ” script νƒœκ·Έλ₯Ό 톡해 μ™ΈλΆ€ 슀크립트 νŒŒμΌμ„ κ°€μ Έμ˜¬ μˆ˜λŠ” μžˆμœΌλ‚˜, κ·Έ νŒŒμΌλ§ˆλ‹€ 독립적인 파일 μŠ€μ½”ν”„λ₯Ό μ§€λ‹ˆκ³  μžˆμ§€ μ•Šκ³  ν•˜λ‚˜μ˜ μ „μ—­ 객체(Global Object)λ₯Ό κ³΅μœ ν•©λ‹ˆλ‹€. 즉 μ—¬λŸ¬ 개의 μ™ΈλΆ€ νŒŒμΌμ„ script νƒœκ·Έλ‘œ λΆˆλŸ¬μ˜€λ”λΌλ„ κ²°κ΅­ ν•˜λ‚˜μ˜ Javascript 파일 내에 μžˆλŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•˜κΈ°μ— μ „μ—­ λ³€μˆ˜κ°€ μ€‘λ³΅λ˜λŠ” λ“±μ˜ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“ˆ νŒ¨ν„΄(Module Pattern)

  • AMD: κ°€μž₯ 였래된 λͺ¨λ“ˆ μ‹œμŠ€ν…œ 쀑 ν•˜λ‚˜λ‘œ require.jsλΌλŠ” 라이브러리λ₯Ό 톡해 처음 κ°œλ°œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • CommonJS: Node.js μ„œλ²„λ₯Ό μœ„ν•΄ λ§Œλ“€μ–΄μ§„ λͺ¨λ“ˆ μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.
  • UMD: AMD와 CommonJS와 같은 λ‹€μ–‘ν•œ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ„ ν•¨κ»˜ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ λ§Œλ“€μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.
  • ES6 Module: Javascript에 λ“œλ””μ–΄ ν‘œμ€€ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ΄ λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“ˆ μ§€μ‹œμž(Module Directive)

  • export μ§€μ‹œμžλ₯Ό λ³€μˆ˜λ‚˜ ν•¨μˆ˜ μ•žμ— 뢙이면 μ™ΈλΆ€ λͺ¨λ“ˆμ—μ„œ ν•΄λ‹Ή λ³€μˆ˜λ‚˜ ν•¨μˆ˜μ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€(λͺ¨λ“ˆ 내보내기).
  • import μ§€μ‹œμžλ₯Ό μ‚¬μš©ν•˜λ©΄ μ™ΈλΆ€ λͺ¨λ“ˆμ˜ κΈ°λŠ₯을 κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€(λͺ¨λ“ˆ κ°€μ Έμ˜€κΈ°).
ES6 Module
  • export μ§€μ‹œμžλ₯Ό μ‚¬μš©ν•΄ λͺ¨λ“ˆ sayHi.js λ‚΄λΆ€μ˜ ν•¨μˆ˜ sayHiλ₯Ό μ™ΈλΆ€λ‘œ 내보낼 수 μžˆμŠ΅λ‹ˆλ‹€.
// πŸ“ sayHi.js
export function sayHi(user) {
  alert(`Hello, ${user}!`);
}
  • import μ§€μ‹œμžλ₯Ό μ‚¬μš©ν•΄ main.jsμ—μ„œ λͺ¨λ“ˆ sayHi.jsλ₯Ό 뢈러올 수 μžˆμŠ΅λ‹ˆλ‹€.
// πŸ“ main.js
import {sayHi} from './sayHi.js';

alert(sayHi); // ν•¨μˆ˜
sayHi('eun'); // Hello, eun!

λͺ¨λ“ˆμ˜ 핡심 κΈ°λŠ₯

  • λͺ¨λ“ˆμ€ 항상 엄격 λͺ¨λ“œ(use strict)둜 μ‹€ν–‰λ©λ‹ˆλ‹€. λ”°λΌμ„œ μ„ μ–Έλ˜μ§€ μ•Šμ€ λ³€μˆ˜μ— 값을 ν• λ‹Ήν•˜λŠ” λ“±μ˜ μ½”λ“œλŠ” μ—λŸ¬κ°€ λ°œμƒλ©λ‹ˆλ‹€.
  • λͺ¨λ“ˆμ€ μžμ‹ λ§Œμ˜ μŠ€μ½”ν”„κ°€ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λͺ¨λ“ˆ λ‚΄λΆ€μ—μ„œ μ •μ˜ν•œ λ³€μˆ˜λ‚˜ ν•¨μˆ˜λŠ” λ‹€λ₯Έ μŠ€ν¬λ¦½νŠΈμ—μ„œ μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.

Namespaces

  • NamespaceλŠ” κ°μ²΄λ‚˜ λ³€μˆ˜κ°€ 겹쳐지지 μ•Šλ„λ‘ μ•ˆμ „ν•œ μ½”λ“œλ₯Ό λ§Œλ“€κΈ° μœ„ν•œ κ°œλ…μž…λ‹ˆλ‹€.
  • Javascriptμ—μ„œλŠ” 아직 Namespacing을 μ§€μ›ν•˜μ§€ μ•Šμ•„ λ‹€μŒ νŠΉμ„±μ„ μ΄μš©ν•©λ‹ˆλ‹€.
    • Javascript의 λͺ¨λ“  κ°μ²΄λŠ” 속성을 κ°–μŠ΅λ‹ˆλ‹€.
    • 객체에 λ‹΄κΈ΄ 속성은 λ‹€λ₯Έ 객체λ₯Ό 담을 수 μžˆμŠ΅λ‹ˆλ‹€.
var globVariable = {}; // μ „μ—­ 객체 ν•˜λ‚˜ 생성

globVariable.sayMyName = function() {
    console.log('eun!'); // ν•¨μˆ˜ μΆ”κ°€
}

globVariable.sayYourName = function() {
    console.log('something!');
}

globVariable.sayMyName()
globVariable.sayYourName()
  • μ „μ—­ 객체에 κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€. ν˜„μž¬λŠ” 직관적인 Module을 더 많이 μ‚¬μš©ν•˜κΈ°μ— 잘 μ‚¬μš©ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.
λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€!