🧸 21.1 μžλ°”μŠ€ν¬λ¦½νŠΈ κ°μ²΄μ˜λΆ„λ₯˜

μžλ°”μŠ€ν¬λ¦½νŠΈ κ°μ²΄λŠ” λ‹€μŒκ³Ό 같이 크게 3개의 객체둜 λΆ„λ₯˜ν•  수 μžˆλ‹€.

  • ν‘œμ€€ 빌트인 객체 ECMAScript μ‚¬μš©μ— μ •μ˜λœ 객체λ₯Ό λ§ν•˜λ©° μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ—­μ˜ 곡톡 κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. ν‘œμ€€ 빌트인 κ°μ²΄λŠ” ECMAScript 사양에 μ •μ˜λœ 객체 μ΄λ―€λ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰ ν™©κ²½κ³Ό 관계없이 μ–Έμ œλ‚˜ μ‚¬μš©ν•  수 μž‡λ‹€. ν‘œμ€€ 빌트인 κ°μ²΄λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ‘œμ„œ μ œκ³΅λœλ‹€. λ”°λΌμ„œ λ³„λ„μ˜ μ„ μ–Έ 없이 μ „μ—­ λ³€μˆ˜μ²˜λŸΌ μ–Έμ œλ‚˜ μ°Έμ‘°ν•  수 μžˆλ‹€.
  • 호슀트 객체 호슀트 κ°μ²΄λŠ” ECMAScript 사양에 μ •μ˜λ˜μ–΄ μžˆμ§€ μ•Šμ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰ ν™˜κ²½(λΈŒλΌμš°μ €ν™˜κ²½μ΄λ‚˜ Node.jsν™˜κ²½) μ—μ„œ μΆ”κ°€λ‘œ μ œκ³΅ν•˜λŠ” 객체λ₯Ό λ§ν•œλ‹€.
  • μ‚¬μš©μž μ •μ˜ 객체 μ‚¬μš©μž μ •μ˜ κ°μ²΄λŠ” ν‘œμ€€ 빌트인 객체와 호슀트 객체처럼 κΈ°λ³Έ μ œκ³΅λ˜λŠ” 객체가 μ•„λ‹Œ μ‚¬μš©μžκ°€ 직접 μ •μ˜ν•œ 객체λ₯Ό λ§ν•œλ‹€.

🧸 21.2 ν‘œμ€€ 빌트인 객체

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 40μ—¬κ°œμ˜ ν‘œμ€€ 빌트인 객체λ₯Ό μ œκ³΅ν•˜λŠ”λ° Math, Reflect, JSON을 μ œμ™Έν•œ λͺ¨λ“  ν‘œμ€€ 빌트인 κ°μ²΄λŠ” ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œμ™€ 정적 λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜κ³ , μƒμ„±μž ν•¨μˆ˜ 객체가 μ•„λ‹Œ ν‘œμ€€ 빌트인 κ°μ²΄λŠ” 정적 λ©”μ„œλ“œλ§Œ μ œκ³΅ν•œλ‹€.

🧸 21.3 μ›μ‹œκ°’κ³Ό 래퍼 객체

λ¬Έμžμ—΄μ΄λ‚˜ 숫자, λΆ€μšΈλ¦¬μ–Έμ˜ μ›μ‹œκ°’μ€ 마치 객체처럼 λ§ˆμΉ¨ν‘œ ν‘œκΈ°λ²•μœΌλ‘œ μ ‘κ·Όν•˜λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ•”λ¬΅μ μœΌλ‘œ μ—°κ΄€λœ 객체λ₯Ό μƒμ„±ν•˜μ—¬ μƒμ„±λœ 객체둜 ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜κ±°λ‚˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³  λ‹€μ‹œ μ›μ‹œκ°’μœΌλ‘œ λ˜λŒλ¦°λ‹€. 이처럼 λ¬Έμžμ—΄, 숫자, λΆ€μšΈλ¦¬μ–Έ 값에 λŒ€ν•΄ 객체처럼 μ ‘κ·Όν•˜λ©΄ μƒμ„±λ˜λŠ” μž„μ‹œ 객체λ₯Ό 래퍼객체라 ν•œλ‹€.

래퍼 객체의 μ²˜λ¦¬κ°€ μ’…λ£Œλ˜λ©΄ 래퍼 객체의 [[StringData]] λ‚΄λΆ€ μŠ¬λ‘―μ— ν• λ‹Ήλœ μ›μ‹œκ°’μœΌλ‘œ μ›λž˜μ˜ μƒνƒœ, 즉 μ‹λ³„μžκ°€ μ›μ‹œκ°’μ„ 갖도둝 되돌리고 래퍼 κ°μ²΄λŠ” 가비지 μ»¬λ ‰μ…˜μ˜ λŒ€μƒμ΄ λœλ‹€.

🧸 21.4 μ „μ—­ 객체

μ „μ—­ κ°μ²΄λŠ” μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ–΄λ–€ 객체보닀도 λ¨Όμ € μƒμ„±λ˜λŠ” νŠΉμˆ˜ν•œ 객체이며, μ–΄λ–€ 객체에도 μ†ν•˜μ§€ μ•Šμ€ μ΅œμƒμœ„ 객체닀.

21.4.1 빌트인 μ „μ—­ ν”„λ‘œνΌν‹°

  • Infinity : Infinity ν”„λ‘œνΌν‹°λŠ” λ¬΄ν•œλŒ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μˆ«μžκ°’ Infinityλ₯Ό κ°–λŠ”λ‹€.
    // μ „μ—­ ν”„λ‘œνΌν‹°λŠ” windowλ₯Ό μƒλž΅ν•˜κ³  μ°Έμ‘°ν•  수 μžˆλ‹€.
    console.log(window.Infinity === Infinity); // true
    
    // μ–‘μ˜ λ¬΄ν•œλŒ€
    console.log(3/0);  // Infinity
    // 음의 λ¬΄ν•œλŒ€
    console.log(-3/0); // -Infinity
    // InfinityλŠ” μˆ«μžκ°’μ΄λ‹€.
    console.log(typeof Infinity); // number
  • NaN : NaN ν”„λ‘œνΌν‹°λŠ” μˆ«μžκ°€ μ•„λ‹˜μ„ λ‚˜νƒ€λ‚΄λŠ” μˆ«μžκ°’ NaN을 κ°–λŠ”λ‹€.
    console.log(window.NaN); // NaN
    
    console.log(Number('xyz')); // NaN
    console.log(1 * 'string');  // NaN
    console.log(typeof NaN);    // number
  • undefined : undefined ν”„λ‘œνΌν‹°λŠ” μ›μ‹œνƒ€μž… undefinedλ₯Ό κ°’μœΌλ‘œ κ°–λŠ”λ‹€.
    console.log(window.undefined); // undefined
    
    var foo;
    console.log(foo); // undefined
    console.log(typeof undefined); // undefined

21.4.2 빌트인 μ „μ—­ ν•¨μˆ˜

  • eval eval ν•¨μˆ˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄μ„ 인수둜 전달 λ°›λŠ”λ‹€. 전달받은 λ¬Έμžμ—΄ μ½”λ“œλ₯Ό λŸ°νƒ€μž„μ— ν‰κ°€ν•˜μ—¬ λŸ°νƒ€μž„ν•œλ‹€. eval ν•¨μˆ˜λŠ” 기쑴의 μŠ€μ½”ν”„λ₯Ό λŸ°νƒ€μž„μ— λ™μ μœΌλ‘œ μˆ˜μ •ν•œλ‹€. 단, strict modeμ—μ„œλŠ” eval ν•¨μˆ˜μ˜ κΈ°μ‘΄ μŠ€μ½”ν”„λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ , eval ν•¨μˆ˜ μžμ‹ μ˜ 자체적인 μŠ€μ½”ν”„λ₯Ό μƒμ„±ν•œλ‹€. eval ν•¨μˆ˜λ₯Ό 톡해 μ‹€ν–‰λ˜λŠ” μ½”λ“œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ΅œμ ν™”κ°€ μˆ˜ν–‰λ˜μ§€ μ•ŠμœΌλ―€λ‘œ 일반적인 μ½”λ“œ 싀행에 λΉ„ν•΄ μ²˜λ¦¬μ†λ„κ°€ λŠλ¦¬λ‹€. λ”°λΌμ„œ eval ν•¨μˆ˜μ˜ μ‚¬μš©μ€ κΈˆμ§€ν•΄μ•Ό ν•œλ‹€.
    // ν‘œν˜„μ‹μΈ λ¬Έ
    eval('1 + 2;'); // -> 3
    // ν‘œν˜„μ‹μ΄ μ•„λ‹Œ λ¬Έ
    eval('var x = 5;'); // -> undefined
    
    // eval ν•¨μˆ˜μ— μ˜ν•΄ λŸ°νƒ€μž„μ— λ³€μˆ˜ 선언문이 μ‹€ν–‰λ˜μ–΄ x λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ—ˆλ‹€.
    console.log(x); // 5
    
    // 객체 λ¦¬ν„°λŸ΄μ€ λ°˜λ“œμ‹œ κ΄„ν˜Έλ‘œ λ‘˜λŸ¬μ‹Όλ‹€.
    const o = eval('({ a: 1 })');
    console.log(o); // {a: 1}
    
    // ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ€ λ°˜λ“œμ‹œ κ΄„ν˜Έλ‘œ λ‘˜λŸ¬μ‹Όλ‹€.
    const f = eval('(function() { return 1; })');
    console.log(f()); // 1
  • isFinite 전달받은 μΈμˆ˜κ°€ 정상적인 μœ ν•œμˆ˜μΈμ§€ κ²€μ‚¬ν•˜μ—¬ μœ ν•œμˆ˜μ΄λ©΄ trueλ₯Ό λ°˜ν™˜ν•˜κ³  λ¬΄ν•œμˆ˜μ΄λ©΄ falseλ₯Ό λ°˜ν™˜ν•œλ‹€. 전달받은 인수의 νƒ€μž…μ΄ μˆ«μžκ°€ μ•„λ‹Œκ²½μš° 숫자둜 νƒ€μž…μ„ λ³€ν™˜ν•œ ν›„ 검사λ₯Ό μˆ˜ν–‰ν•œλ‹€. 이 λ•Œ μΈμˆ˜κ°€ NaN으둜 ν‰κ°€λ˜λŠ” 값이라면 falseλ₯Ό λ°˜ν™˜ν•œλ‹€.
    // μΈμˆ˜κ°€ μœ ν•œμˆ˜μ΄λ©΄ trueλ₯Ό λ°˜ν™˜ν•œλ‹€.
    isFinite(0);    // -> true
    isFinite(2e64); // -> true
    isFinite('10'); // -> true: '10' β†’ 10
    isFinite(null); // -> true: null β†’ 0
    
    // μΈμˆ˜κ°€ λ¬΄ν•œμˆ˜ λ˜λŠ” NaN으둜 ν‰κ°€λ˜λŠ” 값이라면 falseλ₯Ό λ°˜ν™˜ν•œλ‹€.
    isFinite(Infinity);  // -> false
    isFinite(-Infinity); // -> false
    
    // μΈμˆ˜κ°€ NaN으둜 ν‰κ°€λ˜λŠ” 값이라면 falseλ₯Ό λ°˜ν™˜ν•œλ‹€.
    isFinite(NaN);     // -> false
    isFinite('Hello'); // -> false
    isFinite('2005/12/12'); // -> false
  • isNaN 전달받은 μΈμˆ˜κ°€ NaN인지 κ²€μ‚¬ν•˜μ—¬ κ·Έ κ²°κ³Όλ₯Ό λΆˆλ¦¬μ–Έ νƒ€μž…μœΌλ‘œ λ°˜ν™˜ν•œλ‹€.
    // 숫자
    isNaN(NaN); // -> true
    isNaN(10);  // -> false
    
    // λ¬Έμžμ—΄
    isNaN('blabla'); // -> true: 'blabla' => NaN
    isNaN('10');     // -> false: '10' => 10
    isNaN('10.12');  // -> false: '10.12' => 10.12
    isNaN('');       // -> false: '' => 0
    isNaN(' ');      // -> false: ' ' => 0
    
    // λΆˆλ¦¬μ–Έ
    isNaN(true); // -> false: true β†’ 1
    isNaN(null); // -> false: null β†’ 0
    
    // undefined
    isNaN(undefined); // -> true: undefined => NaN
    
    // 객체
    isNaN({}); // -> true: {} => NaN
    
    // date
    isNaN(new Date());            // -> false: new Date() => Number
    isNaN(new Date().toString()); // -> true:  String => NaN
  • parseFloat 전달받은 λ¬Έμžμ—΄ 인수λ₯Ό 뢀동 μ†Œμˆ˜μ  숫자, 즉 μ‹€μˆ˜λ‘œ ν•΄μ„ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
    // λ¬Έμžμ—΄μ„ μ‹€μˆ˜λ‘œ ν•΄μ„ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
    parseFloat('3.14');  // -> 3.14
    parseFloat('10.00'); // -> 10
    
    // 곡백으둜 κ΅¬λΆ„λœ λ¬Έμžμ—΄μ€ 첫 번째 λ¬Έμžμ—΄λ§Œ λ³€ν™˜ν•œλ‹€.
    parseFloat('34 45 66'); // -> 34
    parseFloat('40 years'); // -> 40
    
    // 첫 번째 λ¬Έμžμ—΄μ„ 숫자둜 λ³€ν™˜ν•  수 μ—†λ‹€λ©΄ NaN을 λ°˜ν™˜ν•œλ‹€.
    parseFloat('He was 40'); // -> NaN
    
    // μ•žλ’€ 곡백은 λ¬΄μ‹œλœλ‹€.
    parseFloat(' 60 '); // -> 60
  • parseInt 전달받은 λ¬Έμžμ—΄ 인수λ₯Ό μ •μˆ˜λ‘œ ν•΄μ„ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€. 두 번째 인수둜 진법을 λ‚˜νƒ€λ‚΄λŠ” 기수(2~26)을 전달할 수 μžˆλ‹€.
    // λ¬Έμžμ—΄μ„ μ •μˆ˜λ‘œ ν•΄μ„ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
    parseInt('10');     // -> 10
    parseInt('10.123'); // -> 10
    
    // 10'을 10μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€
    parseInt('10'); // -> 10
    // '10'을 2μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€
    parseInt('10', 2); // -> 2
    // '10'을 8μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€
    parseInt('10', 8); // -> 8
    // '10'을 16μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€
    parseInt('10', 16); // -> 16
    기수λ₯Ό μ§€μ •ν•˜μ—¬ 10μ§„μˆ˜ 숫자λ₯Ό ν•΄λ‹Ή 기수의 λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λ°˜ν™˜ν•˜κ³  싢을 λ•ŒλŠ” Number.prototype.toString λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
    const x = 15;
    
    // 10μ§„μˆ˜ 15λ₯Ό 2μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜μ—¬ κ·Έ κ²°κ³Όλ₯Ό λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.
    x.toString(2); // -> '1111'
    // λ¬Έμžμ—΄ '1111'을 2μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€
    parseInt(x.toString(2), 2); // -> 15
    
    // 10μ§„μˆ˜ 15λ₯Ό 8μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜μ—¬ κ·Έ κ²°κ³Όλ₯Ό λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.
    x.toString(8); // -> '17'
    // λ¬Έμžμ—΄ '17'을 8μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€
    parseInt(x.toString(8), 8); // -> 15
    
    // 10μ§„μˆ˜ 15λ₯Ό 16μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜μ—¬ κ·Έ κ²°κ³Όλ₯Ό λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.
    x.toString(16); // -> 'f'
    // λ¬Έμžμ—΄ 'f'λ₯Ό 16μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€
    parseInt(x.toString(8), 8); // -> 15
    
    // μˆ«μžκ°’μ„ λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œλ‹€.
    x.toString(); // -> '15'
    // λ¬Έμžμ—΄ '15'λ₯Ό 10μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€
    parseInt(x.toString()); // -> 15
  • encodeURI / decodeURI encodeURI ν•¨μˆ˜λŠ” μ™„μ „ν•œ URI λ₯Ό λ¬Έμžμ—΄λ‘œ 전달받아 μ΄μŠ€μΌ€μ΄ν”„ 처리λ₯Ό μœ„ν•΄ μΈμ½”λ”©ν•œλ‹€. Untitled
    // μ™„μ „ν•œ URI
    const uri = 'http://example.com?name=이웅λͺ¨&job=programmer&teacher';
    
    // encodeURI ν•¨μˆ˜λŠ” μ™„μ „ν•œ URIλ₯Ό 전달받아 μ΄μŠ€μΌ€μ΄ν”„ 처리λ₯Ό μœ„ν•΄ μΈμ½”λ”©ν•œλ‹€.
    const enc = encodeURI(uri);
    console.log(enc);
    // http://example.com?name=%EC%9D%B4%EC%9B%85%EB%AA%A8&job=programmer&teacher
    
    const uri = 'http://example.com?name=이웅λͺ¨&job=programmer&teacher';
    
    // encodeURI ν•¨μˆ˜λŠ” μ™„μ „ν•œ URIλ₯Ό 전달받아 μ΄μŠ€μΌ€μ΄ν”„ 처리λ₯Ό μœ„ν•΄ μΈμ½”λ”©ν•œλ‹€.
    const enc = encodeURI(uri);
    console.log(enc);
    // http://example.com?name=%EC%9D%B4%EC%9B%85%EB%AA%A8&job=programmer&teacher
    
    // decodeURI ν•¨μˆ˜λŠ” μΈμ½”λ”©λœ μ™„μ „ν•œ URIλ₯Ό 전달받아 μ΄μŠ€μΌ€μ΄ν”„ 처리 μ΄μ „μœΌλ‘œ λ””μ½”λ”©ν•œλ‹€.
    const dec = decodeURI(enc);
    console.log(dec);
    // http://example.com?name=이웅λͺ¨&job=programmer&teacher
  • encodeURIComponent / decodeURIComponent encodeURIComponent ν•¨μˆ˜λŠ” URI ꡬ성 μš”μ†Œλ₯Ό 인수둜 전달받아 μΈμ½”λ”©ν•œλ‹€.
    // URI의 쿼리 슀트링
    const uriComp = 'name=이웅λͺ¨&job=programmer&teacher';
    
    // encodeURIComponent ν•¨μˆ˜λŠ” 인수둜 전달받은 λ¬Έμžμ—΄μ„ URI의 κ΅¬μ„±μš”μ†ŒμΈ 쿼리 슀트링의 μΌλΆ€λ‘œ κ°„μ£Όν•œλ‹€.
    // λ”°λΌμ„œ 쿼리 슀트링 κ΅¬λΆ„μžλ‘œ μ‚¬μš©λ˜λŠ” =, ?, &κΉŒμ§€ μΈμ½”λ”©ν•œλ‹€.
    let enc = encodeURIComponent(uriComp);
    console.log(enc);
    // name%3D%EC%9D%B4%EC%9B%85%EB%AA%A8%26job%3Dprogrammer%26teacher
    
    let dec = decodeURIComponent(enc);
    console.log(dec);
    // 이웅λͺ¨&job=programmer&teacher
    
    // encodeURI ν•¨μˆ˜λŠ” 인수둜 전달받은 λ¬Έμžμ—΄μ„ μ™„μ „ν•œ URI둜 κ°„μ£Όν•œλ‹€.
    // λ”°λΌμ„œ 쿼리 슀트링 κ΅¬λΆ„μžλ‘œ μ‚¬μš©λ˜λŠ” =, ?, &λ₯Ό μΈμ½”λ”©ν•˜μ§€ μ•ŠλŠ”λ‹€.
    enc = encodeURI(uriComp);
    console.log(enc);
    // name=%EC%9D%B4%EC%9B%85%EB%AA%A8&job=programmer&teacher
    
    dec = decodeURI(enc);
    console.log(dec);
    // name=이웅λͺ¨&job=programmer&teacher

21.4.3 암묡적 μ „μ—­

// μ „μ—­ λ³€μˆ˜ xλŠ” ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•œλ‹€.
console.log(x); // undefined
// μ „μ—­ λ³€μˆ˜κ°€ μ•„λ‹ˆλΌ 단지 μ „μ—­ 객체의 ν”„λ‘œνΌν‹°μΈ yλŠ” ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.
console.log(y); // ReferenceError: y is not defined

var x = 10; // μ „μ—­ λ³€μˆ˜

function foo () {
  // μ„ μ–Έν•˜μ§€ μ•Šμ€ μ‹λ³„μžμ— 값을 ν• λ‹Ή
  y = 20; // window.y = 20;
}
foo();

// μ„ μ–Έν•˜μ§€ μ•Šμ€ μ‹λ³„μž yλ₯Ό μ „μ—­μ—μ„œ μ°Έμ‘°ν•  수 μžˆλ‹€.
console.log(x + y); // 30

μœ„ μ˜ˆμ œμ—μ„œ foo ν•¨μˆ˜κ°€ 호좜되면 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 y λ³€μˆ˜μ— 값을 ν• λ‹Ήν•˜κΈ° μœ„ν•΄ λ¨Όμ € μŠ€μ½”ν”„ 체인을 톡해 μ„ μ–Έλœ λ³€μˆ˜μΈμ§€ ν™•μΈν•œλ‹€. μ΄λ•Œ foo ν•¨μˆ˜μ˜ μŠ€μ½”ν”„μ™€ μ „μ—­ μŠ€μ½”ν”„ μ–΄λ””μ—μ„œλ„ y λ³€μˆ˜μ˜ 선언을 찾을 수 μ—†μœΌλ―€λ‘œ μ°Έμ‘° μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. ν•˜μ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 y = 20 을 window.y = 20으둜 ν•΄μ„ν•˜μ—¬ μ „μ—­ 객체에 ν”„λ‘œνΌν‹°λ₯Ό 동적 μƒμ„±ν•œλ‹€. κ²°κ΅­ yλŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ λ˜μ–΄ 마치 μ „μ—­ λ³€μˆ˜μ²˜λŸΌ λ™μž‘ν•œλ‹€. μ΄λŸ¬ν•œ ν˜„μƒμ„ 암묡적 전역이라고 ν•œλ‹€. yλŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ‘œ μΆ”κ°€λ˜μ—ˆμ„ 뿐이지 λ³€μˆ˜κ°€ μ•„λ‹ˆλ―€λ‘œ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. λ˜ν•œ, μ „μ—­λ³€μˆ˜λŠ” ν”„λ‘œνΌν‹°μ΄μ§€λ§Œ deleteμ—°μ‚°μžλ‘œ μ‚­μ œν•  수 μ—†λ‹€.

profile
μ΄μ‚¬μ€‘μž…λ‹ˆλ‹€!🌟https://velog.io/@devkyoung2

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보