Skip to content

Latest commit

Β 

History

History
314 lines (228 loc) Β· 11.5 KB

File metadata and controls

314 lines (228 loc) Β· 11.5 KB

21μž₯ 빌트인 객체

21.1 Javascript 객체의 λΆ„λ₯˜

  • ν‘œμ€€ 빌트인 객체 : ECMAScript에 μ •μ˜λœ 객체

  • 호슀트 객체 : ECMAScriptμ—λŠ” μ •μ˜λ˜μ–΄ μžˆμ§€ μ•Šμ§€λ§Œ, Javascript μ‹€ν–‰ν™˜κ²½μ—μ„œ μΆ”κ°€λ‘œ μ œκ³΅ν•˜λŠ” 객체

  • μ‚¬μš©μž μ •μ˜ 객체 : μ‚¬μš©μžκ°€ 직접 μ •μ˜ν•œ 객체

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

JavascriptλŠ” Object, Function, Symbol λ“± 40μ—¬κ°œμ˜ ν‘œμ€€ 빌트인 객체λ₯Ό μ œκ³΅ν•œλ‹€. λŒ€λΆ€λΆ„ μƒμ„±μž ν•¨μˆ˜ 객체닀.

μƒμ„±μž ν•¨μˆ˜ 객체인 ν‘œμ€€ 빌트인 κ°μ²΄λŠ” ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œμ™€ 정적 λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.

μƒμ„±μž ν•¨μˆ˜ 객체가 μ•„λ‹Œ ν‘œμ€€ 빌트인 κ°μ²΄λŠ” 정적 λ©”μ„œλ“œλ§Œ μ œκ³΅ν•œλ‹€.

// String μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ String 객체 생성
const strObj = new String("Lee"); // String {"Lee"}

// String μƒμ„±μž ν•¨μˆ˜λ₯Ό 톡해 μƒμ„±ν•œ strObj 객체의 ν”„λ‘œν† νƒ€μž…μ€ String.prototype이닀.
console.log(Object.getPrototypeOf(strObj) === String.prototype); // true

// Number μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ Number 객체 생성
const numObj = new Number(1.5); // Number {1.5}

// toFixedλŠ” Number.prototype의 ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλ‹€.
// Number.prototype.toFixedλŠ” μ†Œμˆ˜μ  자리λ₯Ό λ°˜μ˜¬λ¦Όν•˜μ—¬ λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.
console.log(numObj.toFixed()); // 2

// isIntegerλŠ” Number의 정적 λ©”μ„œλ“œλ‹€.
// Number.isIntegerλŠ” μΈμˆ˜κ°€ μ •μˆ˜(integer)인지 κ²€μ‚¬ν•˜μ—¬ κ·Έ κ²°κ³Όλ₯Ό Boolean으둜 λ°˜ν™˜ν•œλ‹€.
console.log(Number.isInteger(0.5)); // false

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

String, Number, Boolean, Symbol 값에 λŒ€ν•΄ 객체처럼 μ ‘κ·Όν•˜λ©΄ μƒμ„±λ˜λŠ” μž„μ‹œ 객체(JS 엔진이 μ•”λ¬΅μ μœΌλ‘œ 생성)λ₯Ό 래퍼 객체(wrapper object)라고 ν•œλ‹€.

const str = "hi";

// μ›μ‹œ νƒ€μž…μΈ λ¬Έμžμ—΄μ΄ 래퍼 객체인 String μΈμŠ€ν„΄μŠ€λ‘œ λ³€ν™˜λœλ‹€.
console.log(str.length); // 2
console.log(str.toUpperCase()); // HI

// 래퍼 객체둜 ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜κ±°λ‚˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ ν›„, λ‹€μ‹œ μ›μ‹œκ°’μœΌλ‘œ λ˜λŒλ¦°λ‹€.
console.log(typeof str); // string

μžμ„Έν•œ κ³Όμ •

// β‘  μ‹λ³„μž str은 λ¬Έμžμ—΄μ„ κ°’μœΌλ‘œ κ°€μ§€κ³  μžˆλ‹€.const str = 'hello';

// β‘‘ μ‹λ³„μž str은 μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λœ 래퍼 객체λ₯Ό 가리킨닀.
// μ‹λ³„μž str의 κ°’ 'hello'λŠ” 래퍼 객체의 [[StringData]] λ‚΄λΆ€ μŠ¬λ‘―μ— ν• λ‹Ήλœλ‹€.
// 래퍼 객체에 name ν”„λ‘œνΌν‹°κ°€ 동적 μΆ”κ°€λœλ‹€.
str.name = "Lee";

// β‘’ μ‹λ³„μž str은 λ‹€μ‹œ μ›λž˜μ˜ λ¬Έμžμ—΄, 즉 래퍼 객체의 [[StringData]] λ‚΄λΆ€ μŠ¬λ‘―μ— ν• λ‹Ήλœ μ›μ‹œκ°’μ„ κ°–λŠ”λ‹€.
// μ΄λ•Œ β‘‘μ—μ„œ μƒμ„±λœ 래퍼 κ°μ²΄λŠ” 아무도 μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” μƒνƒœμ΄λ―€λ‘œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ˜ λŒ€μƒμ΄ λœλ‹€.

// β‘£ μ‹λ³„μž str은 μƒˆλ‘­κ²Œ μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λœ(β‘‘μ—μ„œ μƒμ„±λœ 래퍼 κ°μ²΄μ™€λŠ” λ‹€λ₯Έ) 래퍼 객체λ₯Ό 가리킨닀.
// μƒˆλ‘­κ²Œ μƒμ„±λœ 래퍼 κ°μ²΄μ—λŠ” name ν”„λ‘œνΌν‹°κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
console.log(str.name); // undefined

// β‘€ μ‹λ³„μž str은 λ‹€μ‹œ μ›λž˜μ˜ λ¬Έμžμ—΄, 즉 래퍼 객체의 [[StringData]] λ‚΄λΆ€ μŠ¬λ‘―μ— ν• λ‹Ήλœ μ›μ‹œκ°’μ„ κ°–λŠ”λ‹€.
// μ΄λ•Œ β‘£μ—μ„œ μƒμ„±λœ 래퍼 κ°μ²΄λŠ” 아무도 μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” μƒνƒœμ΄λ―€λ‘œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ˜ λŒ€μƒμ΄ λœλ‹€.
console.log(typeof str, str);

21.4 μ „μ—­ 객체

μ „μ—­ κ°μ²΄λŠ” μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° 이전 단계에 Javascript 엔진에 μ˜ν•΄ μ–΄λ–€ 객체보닀도 λ¨Όμ € μƒμ„±λ˜λŠ” νŠΉμˆ˜ν•œ 객체이며, μ–΄λ–€ 객체에도 μ†ν•˜μ§€ μ•ŠλŠ” μ΅œμƒμœ„ 객체닀. λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œλŠ” window, node.jsν™˜κ²½μ—μ„œλŠ” global이닀.

μ „μ—­ 객체의 νŠΉμ§•

  • μ˜λ„μ μœΌλ‘œ 생성할 수 μ—†λ‹€.
  • μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•  λ•Œ window(λ˜λŠ” global)λ₯Ό μƒλž΅ν•  수 μžˆλ‹€.
  • λͺ¨λ“  ν‘œμ€€ 빌트인 객체λ₯Ό ν”„λ‘œνΌν‹°λ‘œ κ°€μ§€κ³ μžˆλ‹€.
  • μ‹€ν–‰ν™˜κ²½μ— 따라 μΆ”κ°€μ μœΌλ‘œ ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό κ°–λŠ”λ‹€.
  • varν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜, 암묡적 μ „μ—­, μ „μ—­ν•¨μˆ˜λŠ” μ „μ—­κ°μ²΄μ˜ ν”„λ‘œνΌν‹°κ°€ λœλ‹€.
  • μ—¬λŸ¬ 개의 script νƒœκ·Έλ₯Ό 톡해 javascript μ½”λ“œλ₯Ό 뢄리해도 ν•˜λ‚˜μ˜ μ „μ—­ 객체λ₯Ό κ³΅μœ ν•œλ‹€.

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

Infinity, NaN, undefined

// μ „μ—­ ν”„λ‘œνΌν‹°λŠ” windowλ₯Ό μƒλž΅ν•˜κ³  μ°Έμ‘°ν•  수 μžˆλ‹€.
console.log(window.Infinity === Infinity); // true

console.log(window.NaN); // NaN

console.log(window.undefined); // undefined

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

빌트인 μ „μ—­ ν•¨μˆ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ—­μ—μ„œ ν˜ΈμΆœν•  수 μžˆλŠ” 빌트인 ν•¨μˆ˜λ‘œμ„œ μ „μ—­ 객체의 λ©”μ„œλ“œλ‹€.

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

eval ν•¨μˆ˜λ₯Ό 톡해 μ‚¬μš©μžλ‘œλΆ€ν„° μž…λ ₯받은 μ½˜ν…μΈ λ₯Ό μ‹€ν–‰ν•˜λŠ” 것은 λ³΄μ•ˆμ— 맀우 μ·¨μ•½ν•˜λ‹€. 그리고 일반적인 μ½”λ“œμ‹€ν–‰μ— λΉ„ν•΄ μ²˜λ¦¬μ†λ„κ°€ λŠλ¦¬λ‹€.Β λ”°λΌμ„œ eval ν•¨μˆ˜μ˜ μ‚¬μš©μ€ κΈˆμ§€ν•΄μ•Ό ν•œλ‹€.

isFinite

// μΈμˆ˜κ°€ μœ ν•œμˆ˜μ΄λ©΄ 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

// 숫자
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

// λ¬Έμžμ—΄μ„ μ •μˆ˜λ‘œ ν•΄μ„ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
parseInt("10"); // -> 10
parseInt("10.123"); // -> 10

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

// 16μ§„μˆ˜ λ¦¬ν„°λŸ΄ '0xf'λ₯Ό 16μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  10μ§„μˆ˜ μ •μˆ˜λ‘œ κ·Έ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.
parseInt("0xf"); // -> 15
// μœ„ μ½”λ“œμ™€ κ°™λ‹€.
parseInt("f", 16); // -> 15
// 2μ§„μˆ˜ λ¦¬ν„°λŸ΄(0b둜 μ‹œμž‘)은 μ œλŒ€λ‘œ ν•΄μ„ν•˜μ§€ λͺ»ν•œλ‹€. 0 이후가 λ¬΄μ‹œλœλ‹€.
parseInt("0b10"); // -> 0
// 8μ§„μˆ˜ λ¦¬ν„°λŸ΄(ES6μ—μ„œ λ„μž…. 0o둜 μ‹œμž‘)은 μ œλŒ€λ‘œ ν•΄μ„ν•˜μ§€ λͺ»ν•œλ‹€. 0 이후가 λ¬΄μ‹œλœλ‹€.
parseInt("0o10"); // -> 0

// 'A'λŠ” 10μ§„μˆ˜λ‘œ 해석할 수 μ—†λ‹€.
parseInt("A0"); // -> NaN
// '2'λŠ” 2μ§„μˆ˜λ‘œ 해석할 수 μ—†λ‹€.
parseInt("20", 2); // -> NaN

// 10μ§„μˆ˜λ‘œ 해석할 수 μ—†λŠ” 'A' μ΄ν›„μ˜ λ¬ΈμžλŠ” λͺ¨λ‘ λ¬΄μ‹œλœλ‹€.
parseInt("1A0"); // -> 1
// 2μ§„μˆ˜λ‘œ 해석할 수 μ—†λŠ” '2' μ΄ν›„μ˜ λ¬ΈμžλŠ” λͺ¨λ‘ λ¬΄μ‹œλœλ‹€.
parseInt("102", 2); // -> 2
// 8μ§„μˆ˜λ‘œ 해석할 수 μ—†λŠ” '8' μ΄ν›„μ˜ λ¬ΈμžλŠ” λͺ¨λ‘ λ¬΄μ‹œλœλ‹€.
parseInt("58", 8); // -> 5
// 16μ§„μˆ˜λ‘œ 해석할 수 μ—†λŠ” 'G' μ΄ν›„μ˜ λ¬ΈμžλŠ” λͺ¨λ‘ λ¬΄μ‹œλœλ‹€.
parseInt("FG", 16); // -> 15

// 곡백으둜 κ΅¬λΆ„λœ λ¬Έμžμ—΄μ€ 첫 번째 λ¬Έμžμ—΄λ§Œ λ³€ν™˜ν•œλ‹€.
parseInt("34 45 66"); // -> 34
parseInt("40 years"); // -> 40
// 첫 번째 λ¬Έμžμ—΄μ„ 숫자둜 λ³€ν™˜ν•  수 μ—†λ‹€λ©΄ NaN을 λ°˜ν™˜ν•œλ‹€.
parseInt("He was 40"); // -> NaN
// μ•žλ’€ 곡백은 λ¬΄μ‹œλœλ‹€.
parseInt(" 60 "); // -> 60

encodeURI / decodeURI

encodeURI ν•¨μˆ˜λŠ” μ™„μ „ν•œ URIλ₯Ό λ¬Έμžμ—΄λ‘œ 전달받아 μ΄μŠ€μΌ€μ΄ν”„ 처리λ₯Ό μœ„ν•΄ 인코딩 ν•œλ‹€.

  • μ΄μŠ€μΌ€μ΄ν”„ 처리 - λ„€νŠΈμ›Œν¬λ₯Ό 톡해 정보λ₯Ό κ³΅μœ ν•  λ•Œ μ–΄λ–€ μ‹œμŠ€ν…œμ—μ„œλ„ 읽을 수 μžˆλŠ” μ•„μŠ€ν‚€ 문자 μ…‹μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것

decodeURI ν•¨μˆ˜λŠ” 인코딩 된 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

// decodeURI ν•¨μˆ˜λŠ” μΈμ½”λ”©λœ μ™„μ „ν•œ URIλ₯Ό 전달받아 μ΄μŠ€μΌ€μ΄ν”„ 처리 μ΄μ „μœΌλ‘œ λ””μ½”λ”©ν•œλ‹€.
const dec = decodeURI(enc);
console.log(dec);
// http://example.com?name=이웅λͺ¨&job=programmer&teacher

encodeURIComponent / decodeURIComponent

encodeURIComponent ν•¨μˆ˜λŠ” URI ꡬ성 μš”μ†Œλ₯Ό 인수둜 전달받아 인코딩 ν•œλ‹€.

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 암묡적 μ „μ—­

μ„ μ–Έν•˜μ§€ μ•Šμ€ μ‹λ³„μžμ— 값을 ν• λ‹Ήν•˜λ©΄ μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ λœλ‹€.

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

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

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

JS엔진이 y=20을 window.y = 20으둜 ν•΄μ„ν•˜κ³  동적 μƒμ„±ν•œλ‹€. μ΄λŸ¬ν•œ ν˜„μƒμ„ 암묡적 μ „μ—­ 이라고 ν•œλ‹€. 이 λ•Œ yλŠ” λ³€μˆ˜κ°€ μ•„λ‹ˆλ―€λ‘œ ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. λ˜ν•œ delete μ—°μ‚°μžλ‘œ μ‚­μ œν•  수 μžˆλ‹€. ( λ³€μˆ˜λŠ” delete μ—°μ‚°μžλ‘œ μ‚­μ œκ°€ λΆˆκ°€λŠ₯ν•˜λ‹€.)