Checkpoint - Scope Quiz 10

1. λ‹€μŒμ˜ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚¨ 후에 result 의 κ°’ 은 무엇이 λ κΉŒμš”?

var x = 30 // μ „μ—­λ³€μˆ˜ x μ„ μ–Έ, 일단은 30이닀.

function get() {
  return x // get()ν•¨μˆ˜ μ„ μ–Έ, 근데 λ“€μ–΄μ˜€λŠ” νŒŒλΌλ―Έν„°κ°€ μ—†λ‹€.
}
var result = get(20) // get ν•¨μˆ˜μ— 20μ΄λΌλŠ” 인자λ₯Ό νƒœμ›Œμ„œ μ‹€ν–‰ν•˜λ € ν•œλ‹€.

λ§ˆμ§€λ§‰ 쀄에 get(20) ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•œ κ²°κ³Όλ₯Ό result 에 λ‹΄λŠ”λ‹€. getν•¨μˆ˜ λ‚΄ 20μ΄λΌλŠ” μΈμžκ°€ λ‹΄κΈ°λŠ”λ° μ•„μ‰½κ²Œλ„ μ„ μ–Έλœ ν•¨μˆ˜ function get () 은 μ•ˆμ— λ°›λŠ” νŒŒλΌλ―Έν„°κ°€ μ—†λ‹€.

μ£Όκ³  싢어도 받지 λͺ»ν•˜λŠ” μˆœκ°„μ΄λ‹€.

get() ν•¨μˆ˜λŠ” x λ₯Ό λ¦¬ν„΄ν•˜λŠ”λ°, 이 λ•Œ xλŠ” λ°”κΉ₯의 μ „μ—­ λ³€μˆ˜ x λ₯Ό μ°Έμ‘°ν•˜λ―€λ‘œ 정닡은 30이닀.

2. λ‹€μŒμ˜ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚¨ 후에 result 의 κ°’ 은 무엇이 λ κΉŒμš”?

var x = 30

function get(x) {
  return x
}
var result = get(20)

1번 λ¬Έμ œμ™€λŠ” λ‹€λ₯΄κ²Œ 맨 μ•„λž«μ€„μ—μ„œ get(20) 으둜 인자 20을 ν•¨μˆ˜ get 에 λ³΄λ‚΄λ €λŠ”λ° 받을 수 μžˆλŠ” νŒŒλΌλ―Έν„° x κ°€ μžˆλ‹€.

return x; 이닀. 이 λ•Œ, x λŠ” 방금 받은 20을 κ·ΈλŒ€λ‘œ κ°–λ‹€ μ“΄λ‹€. 1λ²ˆμ—μ„œλŠ” μ „μ—­λ³€μˆ˜ x λ₯Ό μ°Έμ‘° ν–ˆμ§€λ§Œ, κ³΅λΆ€ν–ˆλ“―μ΄ μ°Έμ‘°ν•˜λŠ”λ° μžˆμ–΄μ„œ μ „μ—­λ³€μˆ˜ 보닀 μ§€μ—­λ³€μˆ˜κ°€ μš°μ„  μˆœμœ„κ°€ λ†’λ‹€.

ν•΄μ„œ result λŠ” 20.

3. λ‹€μŒμ˜ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚¨ 후에 result 의 κ°’ 은 무엇이 λ κΉŒμš”?

var x = 30 // μ „μ—­ λ³€μˆ˜, 일단 x λŠ” 30이 할당됨.

function get() {
  return x // parameter κ°€ μ—†λŠ” get() ν•¨μˆ˜λŠ” x λ₯Ό 리턴, μ΄μƒνƒœλΌλ©΄ get ν•¨μˆ˜μ˜ μ‹€ν–‰κ²°κ³ΌλŠ” 30.
}

function set(value) {
  // value λΌλŠ” νŒŒλΌλ―Έν„°λ₯Ό λ°›κ³  curly bracket μ•ˆμ—μ„œ value λ₯Ό μ°Έμ‘°,
  var x = value // κ·Έ value λ₯Ό x 에 μž¬μ„ μ–Έ.
}

set(10) // 이 λ•Œ x λŠ” 10 이 됨.

var result = get(20) // μœ„μ˜ set(10) ν•¨μˆ˜μ™€λŠ” 상관없이 result λŠ” 30. 1번 λ¬Έμ œμ™€ μœ μ‚¬ν•œ 상황이닀.

4. λ‹€μŒμ˜ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚¨ 후에 result 의 κ°’ 은 무엇이 λ κΉŒμš”?

var x = 30

function get() {
  return x
}

function set(value) {
  x = value
}

set(10)

var result = get(20)

이 κ²½μš°λ„ 3번 λ¬Έμ œλž‘ λ˜‘κ°™λ„€ ν•˜λ©΄μ„œ ν•¨μˆ˜ get 은 20을 받아쀄 νŒŒλΌλ―Έν„°κ°€ μ—†μœΌλ‹ˆ return ν•˜λŠ” x λŠ” μ „μ—­ λ³€μˆ˜μΈ 30을 μ°Έμ‘°ν•˜κ² μ§€ 잌 ν•˜λ©΄ ν‹€λ Έλ‹€.

μ΄μœ λŠ” λ°”λ‘œ set(10); ν•¨μˆ˜μ˜ 싀행에 μžˆλ‹€.

set(10) μ‹€ν–‰μœΌλ‘œ 10μ΄λΌλŠ” μΈμžκ°€ ν•¨μˆ˜ set 의 value νŒŒλΌλ―Έν„°μ— 할당이 λœλ‹€.

μ€‘μš”ν•œ 것은, λ‹€μŒμ΄λ‹€.

function set(value) {
  x = value // ν•¨μˆ˜ λ‚΄ value λŠ” 지역 λ²”μœ„λ₯Ό μ°Έμ‘°ν•΄μ„œ ν•¨μˆ˜ μ‹€ν–‰μœΌλ‘œ λ“€μ–΄μ˜¨ 인자 10을 λ³Έλ‹€.
} // 근데 κ·Έ 10 을 x 에 μž¬ν• λ‹Ή ν•˜κ³  μžˆλ‹€. 이러면 μ „μ—­ λ³€μˆ˜κ°€ x κ°€ 10으둜 바뀐닀.

μ΅œμ’…μ μœΌλ‘œ result 10을 λ¦¬ν„΄ν•˜κ²Œ λœλ‹€. μœ„ λΆ€ν„° μ•„λž˜λ‘œ μ‹€ν–‰λ˜λ©° μ½”λ“œλ₯Ό μ½μ–΄λ“€μ΄λŠ” κ±° κ°™λ‹€.

5. λ‹€μŒμ˜ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚¨ 후에 result 의 κ°’ 은 무엇이 λ κΉŒμš”?

var x = 30

function get(x) {
  return x
}

function set(value) {
  x = value //  set(10) μ‹€ν–‰μœΌλ‘œ 10이 x 에 μž¬ν• λ‹Ή. 이제 μ „μ—­ λ³€μˆ˜ x λŠ” 10.
}

set(10)

var result = get(20) // get(20) μ‹€ν–‰μœΌλ‘œ 인자 20이 function get (x), x 에 할당됨. λ°›μ•„λ¨Ήμ—ˆμŒ.

result λŠ” κ·Έλž˜μ„œ 20.

6. λ‹€μŒμ˜ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚¨ 후에 result 의 κ°’ 은 무엇이 λ κΉŒμš”?

var x = 10

function add(y) {
  // 5. y νŒŒλΌλ―Έν„°λ‘œ 5λ₯Ό λ°›μ•„ λ¨Ήμ—ˆλ‹€.
  return x + y // 6. y λŠ” μ§€μ—­λ³€μˆ˜ 5λ₯Ό μ°Έκ³ ν•˜κ³ , x λŠ” μ°Έκ³ ν• κ²Œ μ—†μ–΄μ„œ μ „μ—­ x 10을 μ°Έμ‘°ν•œλ‹€.
} // 7. add(5) λŠ” 5 + 10, 15 λ₯Ό λ¦¬ν„΄ν•˜κ³  μžˆλ‹€.

function strangeAdd(x) {
  // 2. x νŒŒλΌλ―Έν„°λ‘œ 5λ₯Ό λ°›μ•„λ¨Ήμ—ˆλ‹€.
  return add(x) + add(x) // 3. μ•„, μ΅œμ’… κ²°κ³ΌλŠ” add(5) + add(5) λ₯Ό 돌렀주게 ν•˜λŠ”κ΅¬λ‚˜.
} // 4. function add ν•¨μˆ˜μ— 인자 5λ₯Ό νƒœμ›Œ λ³΄λ‚΄λ‹ˆ,

var result = strangeAdd(5) // 1. strangeAdd ν•¨μˆ˜μ— 인자 5λ₯Ό νƒœμ›Œ 보낸닀.

add(5) + add(5) = 30 이 result 의 κ²°κ³Ό 값이 λœλ‹€.

7. λ‹€μŒμ˜ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚¨ 후에 result 의 κ°’ 은 무엇이 λ κΉŒμš”?

var x = 10

function outer() {
  var x = 20

  function inner() {
    return x
  }

  return inner()
}

var result = outer()

outer() ν–ˆμ„ λ•Œ, function inner () 의 λͺ¨μŠ΅λ§Œ λ³΄μ΄λŠ” 게 μ•„λ‹ˆλΌ μ•„μ˜ˆ inner ν•¨μˆ˜κ°€ μ‹€ν–‰ λ˜μ–΄ 버린닀.

inner ν•¨μˆ˜λŠ” x λ₯Ό λ¦¬ν„΄ν•œλ‹€. 근데 κ·Έ x λ₯Ό μ–΄λ””μ„œ μ°Έμ‘°ν•˜λƒλ©΄, μŠ€μ½”ν”„ 법칙에 μ˜ν•΄ 지역 λ³€μˆ˜μΈ,

var x = 20; 을 λ¨Όμ € μ°Έμ‘°ν•΄μ„œ 가지고 μ˜¨λ‹€.

κ·Έλž˜μ„œ 20을 λ¦¬ν„΄ν•˜κ³  result λŠ” 20이닀.

8. λ‹€μŒμ˜ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚¨ 후에 result 의 κ°’ 은 무엇이 λ κΉŒμš”?

var x = 10

function outer() {
  var x = 20 // (4번째). 이제 이 λ³€μˆ˜λŠ” 30으둜 λ°”λ€λ‹ˆλ‹€.

  function inner() {
    x = x + 10 // (3번째). μ—¬κΈ°μ„œ xλŠ” λ°”λ‘œ μœ„ μ§€μ—­λ³€μˆ˜ x = 20 을 κ°€μ Έμ™€μ„œ, + 10 을 ν•œ κ°’ 30을 지역 λ³€μˆ˜ x에 μž¬ν• λ‹Ή ν•©λ‹ˆλ‹€.
    return x // (5번째). λ¦¬ν„΄λ˜λŠ” x λŠ” λ°”λ‘œ μœ„ 지역 λ³€μˆ˜λ‘œ λ³€κ²½λœ 30을 μ°Έμ‘°ν•˜λ―€λ‘œ 30을 λ¦¬ν„΄ν•˜κ³ .
  }
  inner() // (1번째). inner() κ°€ μ•„λ‹ˆλΌ return inner() κ°€ λ§žλŠ”κ²Œ μ•„λ‹Œμ§€ κΆκΈˆν•©λ‹ˆλ‹€.
}

outer() // (2번째). outer() 의 μ‹€ν–‰μœΌλ‘œ inner() ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œν‚΅λ‹ˆλ‹€.
var result = x // (8번째) κ°‘λΆ„ x λŠ” ν•¨μˆ˜ λ‚΄μ˜ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λŒ€μ‹  μ „μ—­ λ³€μˆ˜ x = 10 을 λ°”λΌλ³΄λ―€λ‘œ 10 이 λ©λ‹ˆλ‹€.

κ·Έλž˜μ„œ result λŠ” 10이긴 ν•œλ° μ™œ inner(); μ•žμ— return 이 μ—†λŠ”μ§€ κΆκΈˆν•΄μ„œ μ§ˆλ¬Έμ„ μ˜¬λ Έλ‹€.

2020.09.18 00:10 μˆ˜μ • (μ•„ λ‚˜μ€‘μ— λΈ”λ‘œκ·Έμ— 이런 κΈ°λŠ₯도 μΆ”κ°€ ν•˜κ³  μ‹Άλ‹€)

8번 λ¬Έμ œμ— λŒ€ν•œ 닡변을 κ·ΈλŒ€λ‘œ 이어 λΆ™μ—¬ λ³Έλ‹€.

μ—¬κΈ°μ„œ inner()λ₯Ό return ν•΄ 주지 μ•Šμ€ 것은 ν•¨μ •μž…λ‹ˆλ‹€. inner뒀에 κ΄„ν˜Έλ₯Ό μ—΄κ³  λ‹«μŒμ„ ν†΅ν•΄μ„œ inner ν•¨μˆ˜λŠ” 싀행을 μ‹œμΌœμ£Όμ—ˆκΈ° λ•Œλ¬Έμ— inner()은 30이 될 κ²ƒμž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ 이 μ‹€ν–‰ν•œ inner()λ₯Ό return을 해주지 μ•Šκ³  있기 λ•Œλ¬Έμ— 30μ΄λΌλŠ” 값은 outer ν•¨μˆ˜ μ•ˆμ—μ„œ λ‚˜μ˜€μ§€ λͺ»ν•˜κ³  κ°‡ν˜€μžˆκ²Œ λ©λ‹ˆλ‹€.

즉, μ£Όμ„μ˜ 2번째 λ₯Ό 톡해 outer() ν•¨μˆ˜λ₯Ό μ‹€ν–‰μ‹œν‚€κΈ°λŠ” ν–ˆμ§€λ§Œ, return은 해주지 μ•Šκ³  있기 λ•Œλ¬Έμ— outer ν•¨μˆ˜λŠ” undefinedλ₯Ό return ν•©λ‹ˆλ‹€.

즉, 이 문제λ₯Ό 톡해 λ§ν•˜κ³ μž ν•˜λŠ” λ°”λŠ” outer ν•¨μˆ˜ λ‚΄μ˜ x(지역 λ³€μˆ˜)와 outer ν•¨μˆ˜ λ°–μ˜ x(μ „μ—­ λ³€μˆ˜)λŠ” λͺ…칭은 κ°™μ§€λ§Œ μ „ν˜€ λ‹€λ₯Έ λ³€μˆ˜λΌλŠ” 점을 μ΄ν•΄ν•˜κΈ° μœ„ν•œ λ¬Έμ œμž…λ‹ˆλ‹€!

μ˜€μΌ€! μ΄ν•΄μ™„λ£Œ!

9.λ‹€μŒμ˜ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚¨ 후에 result 의 κ°’ 은 무엇이 λ κΉŒμš”?

var x = 10 // 7. 이제 μ „μ—­ λ³€μˆ˜λŠ” 20.

function outer() {
  x = 20 // 6. outer() ν•¨μˆ˜μ˜ μ‹€ν–‰μœΌλ‘œ μ „μ—­ λ³€μˆ˜ x 에 값을 μž¬ν• λ‹Ή ν•œλ‹€.
  function inner() {
    var x = x + 20 // 2. x λŠ” λ°”λ‘œ μœ„ x = 20 을 μ°Έκ³ ν•΄μ„œ, inner ν•¨μˆ˜μ— xλ₯Ό μž¬μ„ μ–Έ ν–ˆλ‹€.
    return x // 3. 40을 λ¦¬ν„΄ν•œλ‹€.
  }
  inner()
}

outer() // 1. inner() ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κΈ° μ‹œμž‘.
// 5. 40을 λ¦¬ν„΄ν•œλ‹€.

var result = x // 8. μ „μ—­ λ³€μˆ˜ 20을 κ°€μ Έμ˜€λ―€λ‘œ result λŠ” 20.

이 κ²½μš°μ—λŠ” result 값이 λ§žμ•—κΈ΄ ν–ˆμ§€λ§Œ,

outer ν•¨μˆ˜μ—μ„œ 40을 λ°˜ν™˜ν•˜λŠ” 게 μ•„λ‹Œ NaN 을 λ°˜ν™˜ν–ˆλ‹€. μ™œμΌκΉŒ?

var x = 10

function outer() {
  x = 20
  function inner() {
    var x = x + 20
    return x
  }
  return inner()
}

outer()
NaN
let result = x

result
20

μ™œμΌκΉŒ? 이것도 ν—¬ν”„ λ°μŠ€ν¬μ— μ˜¬λ €λ³΄μ•˜λ‹€.

10. λ‹€μŒμ˜ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚¨ 후에 result 의 κ°’ 은 무엇이 λ κΉŒμš”?

var x = 10 // μ „μ—­ λ³€μˆ˜κ°€ 20으둜 μž¬ν• λ‹Ή 됨.

function outer() {
  x = 20
  function inner() {
    x = x + 20 // λ°”λ‘œ μœ„ x μ—μ„œ 20을 κ°€μ Έμ™€μ„œ x κ°€ 40이 된 것을 μ „μ—­ λ³€μˆ˜μ— λ‹€μ‹œ 40으둜 ν• λ‹Ή.
  }
  inner()
}

outer()

var result = x // μ „μ—­λ³€μˆ˜ 40을 result 에 ν• λ‹Ή.

result λŠ” 40.


Written by@[DotoriMook]
ν”„λ‘ νŠΈμ—”λ“œ μ£Όλ‹ˆμ–΄ 개발자 λ„ν† λ¦¬λ¬΅μ˜ 기술개발 λΈ”λ‘œκ·Έ μž…λ‹ˆλ‹€.

GitHubMediumTwitterFacebook