Skip to content

javascript_core

KyusungDev edited this page May 28, 2017 · 11 revisions

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์šฉ ์ •๋ฆฌ

๋ฐ์ดํ„ฐ ํƒ€์ž…

์›์‹œ(๊ธฐ๋ณธ) ํƒ€์ž…(primitive type)

Type Value
Boolean true, false
Number ์ •์ˆ˜, ์‹ค์ˆ˜
String "๋ฌธ์ž์—ด"
Null null
Undefined undefined

์›์‹œ ํƒ€์ž…์€ ์‹ค์ œ ๊ฐ’์„ ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค. ๋น„๊ต์‹œ ์‹ค์ œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ๋น„๊ตํ•œ๋‹ค. ๋ชจ๋“  ์›์‹œ ํƒ€์ž…์€ ๊ฐ’์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฆฌํ„ฐ๋Ÿด ํ˜•์‹์ด ์žˆ๋‹ค.

๋ฆฌํ„ฐ๋Ÿด : ์ฝ”๋“œ์— ์ง์ ‘ ์ž…๋ ฅ๋œ ๋ฌธ์ž์—ด์ด๋‚˜ ์ˆซ์ž์ฒ˜๋Ÿผ ๋ณ€์ˆ˜์— ์ €์žฅ๋˜์ง€ ์•Š์€ ๊ฐ’. ๊ฐ’ ์ž์ฒด

์ฐธ์กฐ ํƒ€์ž…(reference type)

  • Object
  • Array

์ฐธ์กฐ ํƒ€์ž…์€ ํ• ๋‹น๋œ ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ง์ ‘ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฐธ์กฐ ํƒ€์ž…์€ ์‹ค์ œ ๊ฐ’์ด ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์ƒ ์œ„์น˜๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค. ๋ชจ๋“  ์ฐธ์กฐ ํƒ€์ž…๋„ ๊ฐ’์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฆฌํ„ฐ๋Ÿด ํ˜•์‹์ด ์žˆ๋‹ค.

์˜ˆ์ œ : ์›์‹œ ํƒ€์ž…๊ณผ ์ฐธ์กฐ ํƒ€์ž…์˜ ๋น„๊ต ๋ฐฉ์‹

์ฐธ์กฐ ํƒ€์ž…์˜ ๋ณต์‚ฌ (์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ)

์ฐธ์กฐ ํƒ€์ž…์„ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์–•์€๋ณต์‚ฌ(Shallow Copy)์™€ ๊นŠ์€๋ณต์‚ฌ(Deep Copy) ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

์–•์€ ๋ณต์‚ฌ๋Š” 1-depth์— ํ•ด๋‹นํ•˜๋Š” ์†์„ฑ ๊ฐ’๋งŒ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋”ฐ๋ผ์„œ, ๋‚ด๋ถ€ ์†์„ฑ์— ์ฐธ์กฐ ํƒ€์ž… ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์™ธ๋ถ€์—์„œ ์ฐธ์กฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์›๋ณธ ๋ณ€์ˆ˜์˜ ์†์„ฑ๋„ ๋ณ€๊ฒฝ๋œ๋‹ค.

๊นŠ์€ ๋ณต์‚ฌ๋Š” ๋ชจ๋“  ์†์„ฑ์„ ๋ณต์‚ฌํ•˜์—ฌ ์›๋ณธ๊ณผ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋˜๋Š” ์™„์ „ํ•œ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์˜ˆ์ œ : ์ฐธ์กฐ ํƒ€์ž…์˜ ๋ณต์‚ฌ

ํ•จ์ˆ˜

ํ•จ์ˆ˜ ์ƒ์„ฑ ๋ฐฉ์‹

  • ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ๋ฐฉ์‹ (function statement)
function add(x, y) { return x + y; }
  • ํ•จ์ˆ˜ ํ‘œํ˜„์‹ ๋ฐฉ์‹ (function expression)
    • ํ•จ์ˆ˜๋„ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰๋˜๋ฏ€๋กœ ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ํ‘œํ˜„์‹์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋ฐ, ์ด๋ฅผ ์ต๋ช… ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ด๋ผ ํ•œ๋‹ค.
var add = function (x, y) { return x + y; } // ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด
  • Function() ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์‚ฌ์šฉ ๋ฐฉ์‹
    • ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹
var add = new Function('x', 'y', 'return x + y');

ํ•จ์ˆ˜๋„ ๊ฐ์ฒด๋‹ค

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜๋„ ๊ฐ์ฒด๋‹ค. ๋”ฐ๋ผ์„œ ์†์„ฑ(property)์„ ์ถ”๊ฐ€/์‚ญ์ œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ผ๋ฐ˜ ๊ฐ์ฒด๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ๋ฆฌํ„ฐ๋Ÿด์— ์˜ํ•œ ์ƒ์„ฑ
    • ๋ณ€์ˆ˜๋‚˜ ๋ฐฐ์—ด์˜ ์š”์†Œ, ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๋“ฑ์— ํ• ๋‹น ๊ฐ€๋Šฅ
    • ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅ
    • ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ๋ฆฌํ„ด ๊ฐ€๋Šฅ
    • ๋™์ ์œผ๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑ ๋ฐ ํ• ๋‹น ๊ธฐ๋Šฅ

์ด ๊ฐ™์€ ํŠน์ง•์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ์ผ๊ธ‰ ๊ฐ์ฒด(First Class) ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
1๊ธ‰ ๊ฐ์ฒด๋Š” ์œ„์— ๋‚˜์—ดํ•œ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.

1๊ธ‰ ๊ฐ์ฒด(First class object)์˜ ์กฐ๊ฑด

  • ๋ณ€์ˆ˜๋‚˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์•ˆ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.
  • ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ˜ํ™˜๊ฐ’(return value)์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ• ๋‹น์— ์‚ฌ์šฉ๋œ ์ด๋ฆ„๊ณผ ๊ด€๊ณ„์—†์ด ๊ณ ์œ ํ•œ ๊ตฌ๋ณ„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋™์ ์œผ๋กœ ํ”„๋กœํผํ‹ฐ ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ณ€์ˆ˜, ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์œผ๋กœ ํ• ๋‹น
var foo = function () { return 100; }; // ๋ณ€์ˆ˜์— ํ• ๋‹น
var obj = {};
obj.baz = function() { return 200; }; // ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹น
  • ํ•จ์ˆ˜ ์ธ์ž๋กœ ์ „๋‹ฌ
var foo = function(func) { func(); };
foo(function() { console.log('bar'); });
  • ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ํ™œ์šฉ
var foo = function() { 
    return function () {
        console.log('this function is the return value');
    };
};

var bar = foo();
bar();

ํ•จ์ˆ˜์˜ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ

  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋“ฑ ํŠน์ • ์‹œ์ ์— ๋„๋‹ฌํ–ˆ์„๋•Œ ํ˜ธ์ถœ๋˜๋„๋ก ํ•˜๋Š” ํ•จ์ˆ˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ
function doSomething(callback) {
    // ...

    // Call the callback
    callback('stuff', 'goes', 'here');
}

function foo(a, b, c) {
    // I'm the callback
    alert(a + " " + b + " " + c);
}

doSomething(foo);

์ฐธ์กฐ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ดํ•ดํ•˜๊ธฐ

  • ๋‚ด๋ถ€(์ค‘์ฒฉ) ํ•จ์ˆ˜ ํ•จ์ˆ˜ ์ฝ”๋“œ ๋‚ด๋ถ€์— ๋˜ ๋‹ค์‹œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜
    ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ง€์—ญ์ ์œผ๋กœ ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒฝ์šฐ๋‚˜ ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ๋‚ด๋ถ€์—์„œ ์žฌ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉ
function A(){
var a = "1";
  function B(){
    var b = "2";
  }
}
  • ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ (IIFE:Immediately-invoked function expression)
    ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•จ๊ณผ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜
    ์ตœ์ดˆ์— ํ•œ๋ฒˆ์˜ ์‹คํ–‰๋งŒ์„ ํ•„์š”๋กœ ํ•˜๋Š” ์ดˆ๊ธฐํ™” ์ฝ”๋“œ ๋ถ€๋ถ„์— ์‚ฌ์šฉ
    ๋ณ€์ˆ˜๋ฅผ ์ „์—ญ์œผ๋กœ ์„ ์–ธํ•˜๋Š”๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„์‹œ ์‚ฌ์šฉ
// ๊ถŒ์žฅ (๋”๊ธ€๋ผ์Šค ํด๋ฝํฌํŠธ)
(function() {
    init();
}());

(function() {
    init();
})();

ํ•จ์ˆ˜ vs. ๋ฉ”์†Œ๋“œ

ํ•จ์ˆ˜์™€ ๋ฉ”์†Œ๋“œ๋Š” ์ผ๋ จ์˜ ๋™์ž‘๊ณผ, ํ‘œํ˜„๋ฐฉ์‹, ๊ตฌํ˜„๋„ ๋™์ผํ•˜๋‹ค.
ํ•˜์ง€๋งŒ ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋™์ž‘์ด๋‹ค.
๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค.

ํด๋ž˜์Šค : ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ๋ฒ•
๊ฐ์ฒด(์‹ค์ฒดํ™” ๋˜๊ธฐ์ „) : ์ธ์Šคํ„ด์Šค(์‹ค์ฒดํ™” ๋œ ํ›„)
๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šคํ™” : ๊ฐ์ฒด๋ฅผ ์‹ค์ œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ฌ (new Object();)
๊ฐ์ฒด์˜ ์†์„ฑ / ํ”„๋กœํผํ‹ฐ : ๋ฉค๋ฒ„ ํ•จ์ˆ˜(๋ฉ”์†Œ๋“œ), ๋ฉค๋ฒ„ ๋ณ€์ˆ˜

ํ˜ธ์ด์ŠคํŒ…(hoisting)

ํ˜ธ์ด์ŠคํŒ…์˜ ๋‹จ์–ด ๋œป์€ ๋“ค์–ด์˜ฌ๋ฆผ, ๋Œ์–ด์˜ฌ๋ฆผ์ด๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ด์ŠคํŒ…(๋Œ์–ด์˜ฌ๋ฆผ) ํ•œ๋‹ค.

๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌ๋ฌธ์„ ํ•ด์„ํ•  ๋•Œ ์œ ํšจ ๋ฒ”์œ„ ์•ˆ์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ๋ณ€์ˆ˜ ์„ ์–ธ์„ ๋Œ์–ด์˜ฌ๋ฆฐ๋‹ค. ์„ ์–ธ๋ฌธ์€ ํ•ญ์ƒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์—์„œ ์ตœ์šฐ์„ ์œผ๋กœ ํ•ด์„ํ•˜๊ณ , ํ• ๋‹น๋ฌธ์€ ํ”„๋กœ๊ทธ๋žจ ๋™์ž‘๊ณผ์ •์—์„œ ์‹คํ–‰ ๋œ๋‹ค.

์„ ์–ธ(Declaration)๊ณผ ํ• ๋‹น(Assignment)์„ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค.

function hoistingExam(){  
    console.log("value=" + value);
    var value = 10;
    console.log("value=" + value);
}
hoistingExam();

// ์‹คํ–‰๊ฒฐ๊ณผ
// value = undefined  // ๊ฐ’์ด ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ„ (์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š์Œ)
// value = 10  
function hoistingExam(){  
    var value; // ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ… (ํ• ๋‹น์ด ์•„๋‹Œ ์„ ์–ธ๋งŒ ์˜ฌ๋ ค์ง„๋‹ค) 
    console.log("value=" + value);
    value = 10;
    console.log("value=" + value);
}
hoistingExam();  
// ์‹คํ–‰๊ฒฐ๊ณผ
// value = undefined  
// value = 10  
var value = 30;  
function hoistingExam(){  
    console.log("value=" + value); 
    var value = 10; 
    console.log("value=" + value); 
}
hoistingExam();  
// ์‹คํ–‰๊ฒฐ๊ณผ 
// value = undefined (ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์„ ์–ธ๋˜์–ด์ง„ value ๋ณ€์ˆ˜๊ฐ€ ํ˜ธ์ด์ŠคํŒ…๋œ๋‹ค)
// value = 10  

ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ๋ฐฉ์‹์œผ๋กœ ์„ ์–ธ๋œ ํ•จ์ˆ˜๋งŒ ์œ ํšจ ๋ฒ”์œ„ ์•ˆ์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ํ•จ์ˆ˜ ์„ ์–ธ์„ ๋Œ์–ด์˜ฌ๋ฆฐ๋‹ค.

// ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ
hoistingExam(); // ์„ ์–ธ์€ ์•„๋ž˜์— ์žˆ์ง€๋งŒ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค
function hoistingExam(){  
    var hoisting_val = 10;
    console.log("hoisting_val ="+hoisting_val);
}
// ์‹คํ–‰๊ฒฐ๊ณผ
// hoisting_val = 10  
//ํ•จ์ˆ˜ ํ‘œํ˜„์‹
hoistingExam2(); // ํ˜ธ์ด์ŠคํŒ… ์•ˆ๋จ
var hoistingExam2 = function(){  
    var hoisting_val =10;
    console.log("hoisting_val ="+hoisting_val);
}
// ์‹คํ–‰๊ฒฐ๊ณผ (์—๋Ÿฌ)
// hoistingExam2 of object is not a function  
//Function ์ƒ์„ฑ์ž
hoistingExam3(); // ํ˜ธ์ด์ŠคํŒ… ์•ˆ๋จ
var hoistingExam3 = new Function("","return console.log('Ya-ho!!');");  
// ์‹คํ–‰๊ฒฐ๊ณผ (์—๋Ÿฌ)
// hoistingExam3 of object is not a function  

ํ•จ์ˆ˜ ํ‘œํ˜„์‹๊ณผ Function ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•œ ํ•จ์ˆ˜ ์ •์˜๋Š” ๋ณ€์ˆ˜์— ํ•จ์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ์‹์ด๋ฏ€๋กœ ์„ ์–ธ์— ํ•ด๋‹นํ•˜๋Š” ๋ณ€์ˆ˜๋Š” ํ˜ธ์ด์ŠคํŒ… ๋˜์ง€๋งŒ, ํ• ๋‹น์— ํ•ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜ ์ •์˜๋ถ€๋ถ„์€ ํ˜ธ์ด์ŠคํŒ…๋˜์ง€ ์•Š๋Š”๋‹ค.

console.log(fun); // undefined ๊ฐ’์ด ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ„ (์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š์Œ)
var fun = function hello() { console.log('g'); };
console.log(fun); // function () 

์ฐธ์กฐ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜ธ์ด์ŠคํŒ…
์ฐธ์กฐ : Javascript Scope์˜ ์ดํ•ด - ํ˜ธ์ด์ŠคํŒ…

์‹คํ–‰ ์ปจํ…์ŠคํŠธ (Execution Context)

์‹คํ–‰ ๋ฌธ๋งฅ, ์ปจํ…์ŠคํŠธ๋กœ๋„ ๋ถˆ๋ฆฐ๋‹ค. ์‹คํ–‰๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ํ˜•์ƒํ™”ํ•˜๊ณ  ๊ตฌ๋ถ„ํ•˜๋Š” ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์œผ๋กœ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์ฝ”๋“œ ๋ธ”๋ก์ด ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์ „์—ญ ์ฝ”๋“œ, eval() ์‹คํ–‰, ํ•จ์ˆ˜ ์•ˆ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ์ด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์ฝ”๋“œ ์‹คํ–‰์— ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š”๋ฐ ์ •๋ณด๋ž€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ฅผ ๋œปํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ผ์ข…์˜ ํ˜ธ์ถœ ์Šคํƒ(Call Stack)์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ, ์ด ๊ณณ์— ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์Œ“์ธ๋‹ค. ์ด ํ˜ธ์ถœ ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ˜„์žฌ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

  • ํ™œ์„ฑํ™” ๊ฐ์ฒด : ์‹คํ–‰์— ํ•„์š”ํ•œ ์ •๋ณด (arguments, ๋ณ€์ˆ˜, ...)
  • ์œ ํšจ ๋ฒ”์œ„ ์ •๋ณด : ํ˜„์žฌ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • this ๊ฐ์ฒด : ํ˜„์žฌ ์‹คํ–‰ ์ปจํ…์Šคํ‹‘ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํ•จ์ˆ˜ abcFunction์˜ ์‹คํ–‰ ๊ตฌ๋ฌธ์—์„œ ์œ„์™€ ๊ฐ™์€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
์ƒ์„ฑ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ํ™œ์„ฑํ™” ๊ฐ์ฒด ์ƒ์„ฑ
  2. arguments ๊ฐ์ฒด ์ƒ์„ฑ
  3. ์œ ํšจ๋ฒ”์œ„ ์ •๋ณด ์ƒ์„ฑ
  4. ๋ณ€์ˆ˜ ์ƒ์„ฑ
  5. this ๊ฐ์ฒด ๋ฐ”์ธ๋”ฉ
  6. ์‹คํ–‰

์ฐธ์กฐ : Javascript Scope์˜ ์ดํ•ด - ์‹คํ–‰ ๋ฌธ๋งฅ

์Šค์ฝ”ํ”„์™€ ํด๋กœ์ €

์Šค์ฝ”ํ”„

์Šค์ฝ”ํ”„๋ฅผ ์ง์—ญํ•˜๋ฉด ์˜์—ญ, ๋ฒ”์œ„๋ผ๋Š” ๋œป์ด๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์–ธ์–ด์—์„œ์˜ ์œ ํšจ๋ฒ”์œ„๋Š” ์–ด๋А ๋ฒ”์œ„๊นŒ์ง€ ์ฐธ์กฐํ•˜๋Š”์ง€. ์ฆ‰, ๋ณ€์ˆ˜์™€ ๋งค๊ฐœ๋ณ€์ˆ˜(parameter)์˜ ์ ‘๊ทผ์„ฑ๊ณผ ์ƒ์กด๊ธฐ๊ฐ„์„ ๋œปํ•œ๋‹ค.

์ฐธ์กฐ : ์Šค์ฝ”ํ”„์™€ ํด๋กœ์ €

ํด๋กœ์ €

ํŠน์ • ํ•จ์ˆ˜๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๋“ค์ด ์„ ์–ธ๋œ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„(lexical scope : ์ •์  ์œ ํšจ ๋ฒ”์œ„/ ์ฆ‰, ์ •์˜๋œ ํ™˜๊ฒฝ)๋Š” ๊ณ„์† ์œ ์ง€๋˜๋Š”๋ฐ, ๊ทธ ํ•จ์ˆ˜์™€ ์Šค์ฝ”ํ”„๋ฅผ ๋ฌถ์–ด์„œ ํด๋กœ์ €๋ผ๊ณ  ํ•œ๋‹ค.

์ฐธ์กฐ : ์Šค์ฝ”ํ”„์™€ ํด๋กœ์ €

Lexical Scoping์€ ๋‹ค๋ฅธ ๋ง๋กœ Static Scoping ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค. ํ•œ ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„๊ฐ€ ๊ทธ ๋ณ€์ˆ˜๊ฐ€ ์ •์˜๋œ ๋ธ”๋Ÿญ ๋‚ด๋ถ€์—์„œ๋งŒ ์œ ํšจํ•œ ๋ณ€์ˆ˜ ์ฐธ์กฐ ๋ฐฉ๋ฒ•์„ ๋งํ•œ๋‹ค.

this

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ this๋Š” ํ•จ์ˆ˜๋‚˜ ์Šค์ฝ”ํ”„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ˜ธ์ถœ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋œ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ์— ์„ ํ–‰ ๋ถ€๋ชจ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์˜ global object์ธ window ๊ฐ์ฒด๊ฐ€ ๋ถ€๋ชจ๊ฐ€ ๋œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ๋‚ด๋ถ€์ ์œผ๋กœ๋“  ๋ช…์‹œ์ ์œผ๋กœ๋“  call()/apply()๋ฅผ ์ด์šฉํ•˜๋Š”๋ฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜ธ์ถœ์‹œ์— ๋ชจ๋“  this๋Š” someThing์ด๋‹ค.

์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ์—๋„ ๋‚ด๋ถ€์ ์œผ๋กœ call() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

  • someThing.someFunction(arg1, arg2, argN)
  • someFunction.call(someThing, arg1, arg2, argN)
  • someFunction.apply(someThing, [arg1, arg2, argN])

์˜ˆ์ œ : ์ค‘์ฒฉ ํ•จ์ˆ˜์—์„œ์˜ this
์˜ˆ์ œ : ์—ฌ๋Ÿฌ ์ƒํ™ฉ์—์„œ์˜ this

prototype๊ณผ prototype chaining์„ ํ™œ์šฉํ•œ class ๊ตฌํ˜„

์ฐธ์กฐ : ํ”„๋กœํ† ํƒ€์ž…์„ ํ†ตํ•œ ๊ณต์œ 

Clone this wiki locally