π ν΄λ‘μ μ΄ν΄νκΈ°
01 λ³μμ μ ν¨λ²μμ ν΄λ‘μ
- μλ°μ€ν¬λ¦½νΈλ ν¨μμ§ν₯ μΈμ΄μ -> κ°λ°μνν ν¬λ¨ΈμΉ μμ λ₯Ό μ€
- ν¨μ λμ μμ±λ κ°λ₯νκ³ , μμ±ν ν¨μλ₯Ό λ€λ₯Έ ν¨μμ μΈμλ‘ λκΈΈμλ μκ³ μμ±λ κ³³μ΄ μλ κ³³μμ ν¨μλ₯Ό νΈμΆ ν μ μκΈ° λλ¬Έ
- λ ν¨μ λ΄λΆμμ ν¨μ μΈλΆμ μλ λ³μμ μ κ·Ό ν μ λ μμ,,,
κ·Έλ¬λ©΄? ν¨μκ° μμ±λ μ΄νμ μΈλΆ λ³μκ° λ³κ²½λλ©΄?
ν¨μλ μλ‘μ΄ κ°μ κ°μ Έμ€λ?
νΈμΈ¨λλ κ³³μ κΈ°μ€μΌλ‘ μΈλΆλ³μμ μ κ·Όνλ???
μμ£Ό κ°λ¨ν^^ λ¬Έμ λ€μ΄ λ°μνκΈ° λλ¬Έμ μ΄λ₯Ό μκΈ°μν΄ λ°°μμΌν©λλ,.,
02 μ½λ λΈλ‘
- μΌλ¨ μλ°μ€ν¬λ¦½νΈλ
{...}
μμμ μ μΈν λ³μλ μ¬κΈ° μμμλ§ μ¬μ© ν μ μμ
μμ:
{
// μ§μ λ³μλ₯Ό μ μΈνκ³ μ‘°μν΄λ κ²°κ³Όλ₯Ό λ°μμ λ³Ό μ μμ
let message = "Hi"; // λΈλ‘ λ΄μμλ§ κ°λ₯
alert(message); // μλ
νμΈμΉ
}
alert(message); // ReferenceError: message is not defined
- κ·Έλμ μ΄λ° λΈλ‘μ νΉμ§μ νΉμ μμ μ μννλ μ½λλ₯Ό λ¬Άμ΄λλ μν λ‘ μ¬μ©ν μ μμ
- λΈλ‘μμλ μμ μ νμν λ³μλ§ μ¬μ©νλ νμ
{
// λ©μμ§ μΆλ ₯
let message = "μλ
νμΈμ.";
alert(message);
}
{
// λ λ€λ₯Έ λ©μμ§ μΆλ ₯
let message = "μλ
ν κ°μΈμ.";
alert(message);
}
λΈλ‘μ΄ μμΌλ©΄ μλ¬ λ°μν¨ μ΄λ―Έ μ μΈλ λ³μμ λμΌν μ΄λ¦μ κ°μ§ λ³μμ λ³λμ λΈλ‘ μμ΄
let
μΌλ‘ μ μΈνλ©΄ μλ¬κ° λ°μν¨// λ©μμ§ μΆλ ₯ let message = "μλ νμΈμ."; alert(message); // λ λ€λ₯Έ λ©μμ§ μΆλ ₯ let message = "μλ ν κ°μΈμ."; // SyntaxError: Identifier 'message' has already been declared alert(message);
03 μ€μ²© ν¨μ
- ν¨μ λ΄λΆμ μ μΈν ν¨μ? μ€μ²©(nested)ν¨μλΌκ³ λΆλ¦
- jsμμλ λ°λ‘λ μ€μ²©ν¨μλ₯Ό λ§λ€ μ μμ
- μ½λλ₯Ό μ 리νλλ°λ μ°μ
μμ:
function sayHiBye(firstName, lastName) {
// ν¬νΌ(helper) μ€μ²© ν¨μ
function getFullName() {
return firstName + " " + lastName;
}
alert("Hello, " + getFullName());
alert("Bye, " + getFullName());
}
- μ€μ²©ν¨μλ μλ‘μ΄ κ°μ²΄μ νλ‘νΌν° ννλ μ€μ²© ν¨μ κ·Έ μμ²΄λ‘ λ°νλ μ μμ
- μ΄λ¬μ½λ‘¬ λ°νλλ©΄ μ΄λμλ νΈμΆν΄ μ¬μ© κ°λ₯ν¨
- λ¬Όλ‘ μ΄λλ μΈλΆλ³μμ μ κ·Ό ν μ μλ€λ μ¬μ΄
μμ:
function makeCounter() {
let count = 0;
return function () {
return count++;
};
}
let counter = makeCounter();
alert(counter()); // 0
alert(counter()); // 1
alert(counter()); // 2
- μ΄κ±° 보면 counterμ μ¬λ¬κ° λ§λ€λ©΄? μλ‘ λ 립μ μΌκΉ?
- μλλ©΄ ν¨μμ μ€μ²©ν¨μ λ΄
count
λ³μμλ μ΄λ€ κ°μ΄ ν λΉλ κΉ??
μ΄κ±° ν΄κ²°νλ©΄ js μ€κΈ κ°λ₯ν©λλ€,,,
04 λ μ컬 νκ²½
머리μν μ€λΉ ν΄μΌν λ―,,,
1λ¨κ³-λ³μ
- jsμμ μ€νμ€μΈ ν¨μ, μ½λλΈλ‘
{...}
, μ€ν¬λ¦½νΈ μ 체λ λ μ컬 νκ²½(Lexical Environment) λΌ λΆλ¦¬λ λ΄λ¬΄ μ¨κΉ μ°κ΄ κ°μ²΄(internal hidden associated object)λ₯Ό κ°μ§ - μ΄ νκ²½ κ°μ²΄λ 2λΆλΆμΌλ‘ ꡬμ±λ¨
- νκ²½ λ μ½λ(Environment Record) : λͺ¨λ μ§μλ³μλ₯Ό νλ‘νΌν°λ‘ μ μ₯νκ³ μλ κ°μ²΄, thisμ κ°μ κΈ°νμ 보λ μ¬κΈ°μ μ μ₯
- μΈλΆ λ μ컬 νκ²½(Outer Lexical Environment)μ λν μ°Έμ‘° : μΈλΆμ½λμ μ°κ΄λ¨
βλ³μβλ νΉμ λ΄λΆ κ°μ²΄μΈ
νκ²½λ μ½λ
μ νλ‘νΌν°μΌ λΏμ
βλ³μλ₯Ό κ°μ Έμ€κ±°λ, λ³κ²½νλκ²βμ βνκ²½λ μ½λμ νλ‘νΌν°λ₯Ό κ°μ Έμ€κ±°λ λ³κ²½ν¨βμ μλ―Έν¨
μμ:
// μ΄ λ μ€μ§λ¦¬ μ½λμλ λ μ컬 νκ²½μ΄ νλλ§ μ‘΄μ¬ν¨
let phrase = "hello"; // Lexcial Environment [ phrase: "hello" ] ->(outer)-> null
alert(phrase);
- μ΄λ κ² μ€ν¬λ¦½νΈ μ 체μ κ΄λ ¨λ λ μ컬 νκ²½μ μ μ λ μ컬 νκ²½μ΄λΌ λΆλ¦(global Lexical Environment)
- μ μ½λμμ
[ ]
λ λ³μκ° μ μ₯λλ νκ²½ λ μ½λλ₯Ό λνλ - λ μ μ λ μ컬μ μΈλΆ μ°Έμ‘°
(outer)
κ° μκΈ° λλ¬Έμ nullλ₯Ό κ°λ¦¬ν΄
μμ:
// execution start : Lexcial Environment [ phrase: <uninitialized> ] ->(outer)-> null
let phrase; // Lexcial Environment [ phrase: undefined ]
phrase = "Hello"; // Lexcial Environment [ phrase: "Hello" ]
phrase = "Bye"; // Lexcial Environment [ phrase: "Bye" ]
-
μ€ν¬λ¦½νΈκ° μμλλ©΄ μ€ν¬λ¦½νΈ λ΄μμ μ μΈν λ³μ κ°μ²΄κ° λ μ컬 νκ²½μ μ¬λΌκ°(pre-populated)
- μ΄λ λ³μμ μνλ νΉμ λ΄λΆ μν(special internal state)μΈ βuninitializedβκ° λ¨
- js λ
uninitialized
μνμΈ λ³μλ₯Ό μΈμ§νκΈ΄ νμ§λ§,,let
μ λ§λκΈ° μ κΉμ§ μ°Έμ‘° λΆκ°λ₯
let phrase
λ₯Ό λ§λ¬μ§λ§ μμ§ κ°μ ν λΉμ΄ μλμκΈ°μ νλ‘νΌν° κ°μundefined
μ΄κ³phrase
λ μ΄λλΆν° μ¬μ©ν μ μμphrase
μ κ°μ΄ ν λΉλ¨phrase
μ κ°μ΄ ν λΉλ¨
μμ½νμλ©΄,,
- λ³μλ νΉμ λ΄λΆ κ°μ²΄μΈ νκ²½ λ μ½λμ νλ‘νΌν°μ
- νκ²½ λ μ½λλ νμ¬ μ€νμ€μΈ ν¨μμ μ½λλΈλ‘, μ€ν¬λ¦½νΈμ μ°κ΄λμ΄ μμ
- λ³μλ₯Ό λ³κ²½νλ©΄ νκ²½ λ μ½λμ νλ‘νΌν°κ° λ³κ²½λ¨
2λ¨κ³-ν¨μ μ μΈλ¬Έ
ν¨μλ λ³μμ λ§μ°¬κ°μ§λ‘ κ°μ,,
- κ·Έλ¬λ,,,, ν¨μ μ μΈλ¬Έ(Function declaration)μΌλ‘ μ μΈν ν¨μλ μΌλ° λ³μμ λ€λ₯΄κ² λ°λ‘ μ΄κΈ°νκ° λλ€λ μ μμ μ°¨μ΄κ° μμ(κ°λΉ‘μΉλΉ)
- κ·Έλ¬λκΉ μ΄κ±Έλ‘ λ§λ€λ©΄ λ μ컬 νκ²½μ΄ λ§λ€μ΄μ§λ μ¦!μ! μ¬μ©ν μ μμ
- νλ±ν λ³μλ letμ λ§λμΌμ§λ§ μ¬μ©ν μ μμ§λ§ γ
- κ·Έλμ μ μΈλκΈ°μ μλ ν¨μλ₯Ό μ¬μ©ν μ μλκ² λ°λ‘ μ΄λλ¬Έμ
μμ:
//execution start : Lexcial Environment [
// phrase: <uninitialized>,
// say: function
// ] ->(outer)->null
let phrase = "Hello";
function say(name) {
alert($`{name}`);
}
μ΄λ° λμ λ°©μμ ν¨μ μ μΈλ¬ΈμΌλ‘ μ μν ν¨μμλ§ μ μ©λ¨
λ°λΌμ let say = function(name)...
μ κ°μ΄ λ³μμ ν λΉλ ν¨μ ννμ(function expression)μ ν΄λΉνμ§ μμ
3λ¨κ³-λ΄λΆμ μΈλΆ λ μ컬 νκ²½
- ν¨μλ₯Ό νΈμΆν΄ μ€ννλ©΄ μλ‘μ΄ λ μ컬νκ²½μ΄ μλμΌλ‘ λ§λ€μ΄μ§μμ?
-
μ΄ νκ²½μλ νΈμΆμ λ겨λ°μ λ§€κ°λ³μμ ν¨μμ μ§μλ³μκ° μ μ₯λ¨!(μ€μ)
say("μ±μ€")
μ νΈμΆνλ©΄ μ΄λ€ λ³νκ° μκΈΈκΉ?
μμ:
let phrase = "Hello";
// Lexcial Environment of the call [
// name: "μ±μ€",
// ] ->(outer)-> [
// say: function
// phraseL : "Hello"
// ] ->(outer)-> null
function say(name) {
alert(`${phrase}, ${name}`); // μ΄κ² μ€νλ λ κ° μμ μ£Όμ
}
say("μ±μ€"); // Hello, μ±μ€
-
ν¨μκ° νΈμΆμ€μΈ λμμ νΈμΆμ€μΈ ν¨μλ₯Ό μν λ΄λΆ λ μ컬 νκ²½κ³Ό μ΄κ² κ°λ¦¬ν€λ μΈλΆ λ μ컬 νκ²½μ κ°μ§κ² λ¨
- μμμ λ΄λΆ λ μ컬 νκ²½μ νμ¬ μ€νμ€μΈ
say
μ μμ - μ΄ νκ²½μ ν¨μμ μΈμμΈ
name
μΌλ‘ λΆν° μ λν νλ‘νΌν° νλλ§ μ‘΄μ¬ν¨ say("μ±μ€")
μ νΈμΆνκΈ° λλ¬Έμ,name
κ°μ"μ±μ€"
μ΄ λ¨- μ΄ μμμ μΈλΆ λ μ컬 νκ²½μ μ μ λ μ컬 νκ²½μ
- μ μ λ μ컬 νκ²½μ
phrase
μ ν¨μsay
λ₯Ό νλ‘νΌν°λ‘ κ°μ§
- μμμ λ΄λΆ λ μ컬 νκ²½μ νμ¬ μ€νμ€μΈ
-
λ΄λΆ λ μ컬 νκ²½μ μΈλΆλ μ컬 νκ²½μ λν μ°Έμ‘°λ₯Ό κ°μ§!!!
- μ½λμμ λ³μλ₯Ό μ κ·Όν λ, λ¨Όμ λ΄λΆ λ μ컬μμ μ°Ύμ
- μ΄? λͺ»μ°Ύμλ€? μ΄ νκ²½μ΄ μ°Έμ‘°νλ μΈλΆ λ μ컬 νκ²½μΌλ‘ νμ₯ν΄μ μ°Ύμ
- μ΄? λͺ»μ°Ύμλ€? β¦recursive?
- μΈμ κΉμ§? κ²μλ²μκ° μ μ λ μ컬 νκ²½μΌλ‘ νμ₯λ λ κΉμ§!!
- λ§μ½ strict λͺ¨λ(μ격ν λͺ¨λ)μμ μ μμμλ λ³μλ₯Ό λͺ»μ°Ύμλ€? error λμμ€
- νμ§λ§ λΉ μ격λͺ¨λμμλ μ μλμ§ μμ λ³μμ κ°μ ν λΉνλ €κ³ νλ©΄ μλ¬λμ ,,,
- μλ‘μ΄ μ μ λ³μκ° λ§λ€μ΄μ§λλ° μ΄κ±΄ νμ νΈνμ±μ μν΄ κ·Έλ λ€λ€μ
4λ¨κ³-ν¨μλ₯Ό λ°ννλ ν¨μ
κ±°μ λλκ°μ©,,
λ€μ 맨μ²μ makeCounter
μμλ₯Ό 보면?
μμ:
function makeCounter() {
let count = 0; // μ¬κΈ°λΆλΆμμ λ³ΌκΊΌμ
return function () {
return count++; // λλ²μ§Έ λΆλΆμ μ¬κΈ°μ
};
}
let counter = makeCounter();
alert(counter()); // 0
alert(counter()); // 1
alert(counter()); // 2
makeCounter
λ₯Ό νΈμΆνλ©΄ νΈμΆν λ λ§λ€ μλ‘μ΄ λ μ컬 νκ²½ κ°μ²΄κ° λ§λ€μ΄μ§κ³ (μ΄μ μκ² μ§?) μ¬κΈ°μmakeCounter
κ° μ€ννλλ° νμν λ³μλ€μ΄ μ μ₯λλ€κ΅¬μ]- κ·Έ λ μ
say("μ±μ€")
μμμ λ§μ°¬κ°μ§λ‘makeCounter
κ° μ€νλλ©΄ 2κ°μ λ μ컬 νκ²½μ΄ λ§λ€μ΄μ§
λ©κΉμ??? μ λ΅μβ¦?
λ¨Έ λ΄λΆ νλ,, μ μ νλ λ§λ€μ΄μ§κ² μ° λ¨Έ
κ·Όλ° μ°¨μ΄μ μ΄ μμβ¦. κ·Έκ² λ¨Έλλ©΄,,
makeCounter()
κ° μ€νλλ λμ€μ λ³Έλ¬Έ(return count++)
μ΄ νμ€μ§λ¦¬μΈ μ€μ²© ν¨μκ° λ§λ€μ΄μ§λ€λμ !!- κ·Έλ¬λκΉ νμ¬λ μ€μ²© ν¨μκ° μμ±λκΈ°λ§ νκ³ μ€νμ λμ§ μλ μνμ
λ μ¬κΈ°μ μ€μνκ² νλκ° λ μλλ°β¦
- λͺ¨λ ν¨μλ ν¨μκ° μμ±λ κ³³μ λ μ컬 νκ²½μ κΈ°μ΅ν¨!!!!
- ν¨μλ
[[Environment]]
λΌ λΆλ¦¬λ μ¨κΉ νλ‘νΌν°λ₯Ό κ°λλ°,, μ¬κΈ°μ ν¨μκ° λ§λ€μ΄μ§ κ³³μ λ μ컬 νκ²½μ λν μ°Έμ‘°κ° μ μ₯λ¨
λ°λΌμ λλ²μ§Έ λΆλΆμ 보면
counter.[[Environment]]
μ{count:0}
μ΄ μλ λ μ컬 νκ²½μ λν μ°Έμ‘°κ° μ μ₯λλ€κ΅¬μ- νΈμΆμ₯μμ μκ΄μμ΄ κΈ°μ΅νλ건? μ κ±°λλ¬Έμ΄λΌκ΅¬μ©
-
μλ μμ±λ λ λ± νλ² μ€μ λκ³ , μμ,,,ν λ³νμ§ μμμ©
- κ·Έλμ
counter()
λ₯Ό νΈμΆνλ©΄ κ° νΈμΆλ§λ€ μλ‘μ΄ λ μ컬 νκ²½μ΄ μμ±λ¨ - μ΄ν μμμ μ μ°Έμ‘°νκ² μ§?
κ·Έλ¦¬κ³ λμ μ€ν νλ¦μ΄ μ€μ²©ν¨μμ λ³Έλ¬ΈμΌλ‘ λμ΄μ€λ©΄,,
count
λ³μκ° νμνλ°,- λ¨Όμ μ체 λ μ컬μμ λ³μλ₯Ό μ°Ύμ
- κ·Έλ¬λ μ΅λͺ μ€μ²© ν¨μμ μ§μλ³μκ° μκΈ° λλ¬Έμ μ΄ λ μ컬μ λΉμ΄μλ μν©
- μ΄μ
counter()
μ λ μ컬 νκ²½μ΄ μ°Έμ‘°νλ μΈλΆ λ μ컬 νκ²½μμcount
λ₯Ό μ°Ύμ - μ΄λ¨Έ μ°Ύμλ²λ Έλ€?
- μ΄ν
count++
κ° μ€νλλ©΄μcount
κ°μ΄ 1 μ¦κ°ν΄μΌνλλ°,,,, - λ³μ«κ° κ°±μ μ μ΄λμ μΌμ΄λλ€? λ³μκ° μ μ₯λ λ μ컬μμ μΌμ΄λλ€!
04 κ·Έλμ ν΄λ‘μ λ μ΄λκ°κ³ μ΄κ²λ§ μ€λͺ ν¨?
ν΄λ‘μ λ μΈλΆλ³μλ₯Ό κΈ°μ΅νκ³ μ΄ μΈλΆλ³μμ μ κ·Όν μ μλ ν¨μλ₯Ό μλ―Έν¨
ν¨μμ λ μ컬 νκ²½μ μ‘°ν©
- λͺλͺ μΈμ΄μμλ ν΄λ‘μ ꡬνμ΄ λΆκ°λ₯νκ±°λ,,, νΉμν λ°©μμΌλ‘ ν¨μλ₯Ό μμ±ν΄μΌν¨
- νμ§λ§ jsμμλ λͺ¨λ ν¨μκ° μμ°μ€λ½κ² ν΄λ‘μ κ° λ¨
- μμΈκ° μκΈ΄νλ°,,, new Function λ¬Έλ² μμ λ€λ£¨λ©΄ λ λ―,,?
- μλ¬΄νΌ jsμ κ³ μ ν κ°λ μ΄ μλ μ¬λ¬ ν¨μν νλ‘κ·Έλλ° μΈμ΄μμ 곡ν΅μ μΌλ‘ λ°κ²¬λλ νΉμ±μ΄λΌκ΅¬
κ·Έλμ μμ°λλ°?
- λ°μ΄ν°λ₯Ό 보쑴ν μ μλ€κ³ μ^^
- μ 보 μ κ·Όμ νμ΄ κ°λ₯νκ²μ£ ? (μΊ‘μν)
- λͺ¨λνμλ μ 리νκ² μ£ ?
κ·Έλμ λ€μ ν΅μ¬
μ€μ½νλ₯Ό μ΄μ©ν΄μ λ³μμ μ κ·Ό λ²μλ₯Ό λ«λ(ν¨μ)κ²μ μμ
ν¨μμ νΈμΆλλ νκ²½κ³Όλ λ³κ°λ‘, κΈ°μ‘΄μ μ μΈλμ΄μλ νκ²½(μ΄νμ νκ²½)μ κΈ°μ€μΌλ‘ λ³μλ₯Ό μ‘°νν¨
ν΄λ‘μ λ νΉμ μν©μμ λ°μνλ βνμβμ΄κ³ , ν¨μλ μ΄ νμμ΄ λνλκΈ° μν β쑰건βμ ν΄λΉλ¨
λκΈλ¨κΈ°κΈ°