Skip to content

inside_javascript_1

kyusung edited this page Apr 13, 2017 · 1 revision

์ธ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

ํ•จ์ˆ˜

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

    • ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ๋ฐฉ์‹ (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');
  • ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ… (Function Hoisting)

    • ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ๋ฐฉ์‹์œผ๋กœ ์ •์˜ํ•œ ํ•จ์ˆ˜๋Š” ์ฝ”๋“œ์˜ ๋งจ ์ฒ˜์Œ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง€๊ฒŒ(hoisting) ๋˜๋ฏ€๋กœ ์ •์˜๊ฐ€ ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    add(2, 3); // ํ˜ธ์ถœ ๊ฐ€๋Šฅ
    function add(x, y) { return x + y };

    ๋”๊ธ€๋Ÿฌ์Šค ํฌ๋ฝํฌ๋“œ๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์ด ๊ตฌ์กฐ๋ฅผ ์—‰์„ฑํ•˜๊ฒŒ ๋งŒ๋“ค์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํ•จ์ˆ˜ ํ‘œํ˜„์‹ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค.

  • ํ•จ์ˆ˜ ๊ฐ์ฒด

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

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

    • ๋ณ€์ˆ˜, ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์œผ๋กœ ํ• ๋‹น

      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();
    • ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ๊ธฐ๋ณธ ํ”„๋กœํผํ‹ฐ

      • ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” ์•„๋ž˜ ๋‚˜์—ด๋œ ๊ธฐ๋ณธ(๋‚ด๋ถ€) ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
        length, prototype (ํ‘œ์ค€)
        name, caller, arguments, [[Prototype]] (๋น„ํ‘œ์ค€)

      ECMA ํ‘œ์ค€์—์„œ๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜๋Š” ํ”„๋กœํ†  ํƒ€์ž… ๊ฐ์ฒด๋ฅผ Function.prototype ๊ฐ์ฒด๋ผ๊ณ  ํ•˜๋ฉฐ, ์ด๊ฒƒ ์—ญ์‹œ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ผ๊ณ  ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.

      • ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ๋ถ€๋ชจ( Internal Property [[Prototype]] ) > Function.prototype ๊ฐ์ฒด (ํ•จ์ˆ˜ ๊ฐ์ฒด)

      • Function.prototype์˜ ๋ถ€๋ชจ ( Internal Property [[Prototype]] ) > Object.prototype ๊ฐ์ฒด

      • ECMAScript ๋ช…์„ธ์—๋Š” Function.prototype ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋“ค์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ธฐ์ˆ ํ•˜๊ณ  ์žˆ๋‹ค.

        1. constructor ํ”„๋กœํผํ‹ฐ
        2. toString() ๋ฉ”์„œ๋“œ
        3. apply(thisArg, argArray) ๋ฉ”์„œ๋“œ
        4. call(thisArg, [, arg1, [,arg2,]]) ๋ฉ”์„œ๋“œ
        5. bind(thisArg, [, arg1, [,arg2,]]) ๋ฉ”์„œ๋“œ
  • ํ•จ์ˆ˜์˜ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ

    • ์ฝœ๋ฐฑ ํ•จ์ˆ˜ : ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋“ฑ ํŠน์ • ์‹œ์ ์— ๋„๋‹ฌํ–ˆ์„๋•Œ ํ˜ธ์ถœ๋˜๋„๋ก ํ•˜๋Š” ํ•จ์ˆ˜.
    • ์ฆ‰์‹œ ์‹œํ–‰ ํ•จ์ˆ˜ : ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•จ๊ณผ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜. ์ตœ์ดˆ์— ํ•œ๋ฒˆ์˜ ์‹คํ–‰๋งŒ์„ ํ•„์š”๋กœ ํ•˜๋Š” ์ดˆ๊ธฐํ™” ์ฝ”๋“œ ๋ถ€๋ถ„์— ์‚ฌ์šฉ.
    • ๋‚ด๋ถ€ ํ•จ์ˆ˜ : ํ•จ์ˆ˜ ์ฝ”๋“œ ๋‚ด๋ถ€์— ๋˜ ๋‹ค์‹œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜.
  • ํ˜ธ์ถœ ํŒจํ„ด๊ณผ this ๋ฐ”์ธ๋”ฉ

    • ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ
      this๋Š” ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.

      var myObject = { 
          name: 'foo', 
          sayName: function() { console.log(this.name);}
      };
      var otherObject = { name: 'bar' };
      
      otherObject.sayName = myObject.sayName;
      myObject.sayName();
      otherObject.sayName();
      
      // ์ถœ๋ ฅ ๊ฒฐ๊ณผ
      > foo
      > bar
    • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ
      ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋œ this๋Š” ์ „์—ญ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค. (๋ธŒ๋ผ์šฐ์ €์˜ ๊ฒฝ์šฐ window)
      ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ๋„ this๋Š” ์ „์—ญ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.
      ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.

      var value = 100;
      var myObject = { 
          value: 1, 
          func1: function() { 
              var that = this;    // ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ์ €์žฅ
              this.value += 1;
      
              func2 = function() {
                  that.value += 1;
              }
      }}
    • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ this ๋ฐ”์ธ๋”ฉ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š”๋ฐ, ๊ธฐ์กด ํ•จ์ˆ˜์— new ์—ฐ์‚ฐ์ž๋ฅผ ๋ถ™์—ฌ์„œ ํ˜ธ์ถœํ•˜๋ฉด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•œ๋‹ค.
      ์ด๋Š” ์˜๋„์™€ ๋‹ฌ๋ฆฌ ์›์น˜ ์•Š์€ ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ •์˜๋จ์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜์ด๋ฆ„์˜ ์ฒซ ๋ฌธ์ž๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ์“ฐ๊ธฐ๋ฅผ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค.

      // ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๋กœ ๊ฐ์ฒด ์ƒ์„ฑ
      var foo = {
          name: 'foo',
          age: 35,
          gender: 'men'
      };
      console.dir(foo);
      
      // ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๊ฐ์ฒด ์ƒ์„ฑ
      function Person(name, age, gender) {
          this.name = name;
          this.age = age;
          this.gender = gender;
      }
      
      var bar = new Person('bar', 33, 'woman');
      var baz = new Person('baz', 24, 'woman');
      
      console.dir(bar);
      console.dir(baz);
      
      // ๋””๋ฒ„๊น…
      > Object
        age: 35
        gender: "man"
        name: "foo"
        __proto__: Object
      > Person
        age: 33
        gender: "woman"
        name: "bar"
        __proto__: Person
      > Person
        age: 25
        gender: "woman"
        name: "baz"
        __proto__: Person
      • ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์‹์˜ ์ฐจ์ด(๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด vs ์ƒ์„ฑ์ž ํ•จ์ˆ˜)
        ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋Š” ์ž์‹ ์„ ์ƒ์„ฑํ•œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๋ฅผ ์ž์‹ ์˜ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋กœ ์„ค์ •ํ•œ๋‹ค.
        • ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์—์„œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ : Object()
        • ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋ฐฉ์‹์—์„œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ : Person() (์ž์‹  ์ž์ฒด)

      ์ „๋ฌธ๊ฐ€๋“ค์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ๊ตฌ๋ถ„์ด ์—†์œผ๋ฏ€๋กœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ํ•จ์ˆ˜๋Š” ๋Œ€๋ฌธ์ž๋กœ ํ‘œ๊ธฐํ•˜๋Š” ๋„ค์ด๋ฐ ๊ทœ์น™์„ ๊ถŒ์žฅํ•˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

      function A(arg) {
        if (!(this instanceof A)) // this๊ฐ€ A์˜ instance ์ธ์ง€ ํ™•์ธ
            return new A(arg);
        this.value = arg ? arg : 0;
      }
    • call๊ณผ apply ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ ๋ช…์‹œ์ ์ธ this ๋ฐ”์ธ๋”ฉ
      apply(), call() ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋“  ํ•จ์ˆ˜์˜ ๋ถ€๋ชจ ๊ฐ์ฒด์ธ Function.prototype ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ์ด๋ฏ€๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

      function.apply(thisArg, argArray); // ์ธ์ž๋ฅผ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ํ˜ธ์ถœ  
      function.call(thisArg[, arg1[, arg2[, ...]]]); // ์ธ์ž๋ฅผ ์—ด๊ฑฐํ•˜๋Š” ํ˜•ํƒœ๋กœ ํ˜ธ์ถœ

      ์•„๋ž˜ ์ฝ”๋“œ๋Š” ๊ฒฐ๊ตญ Person('foo', 30, 'man') ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ this๋ฅผ foo ๊ฐ์ฒด๋กœ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ ํ•˜๋Š”๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

      function Person(name, age, gender) {
          this.name = name;
          this.age = age;
          this.gender = gender;
      }
      
      var foo = {};
      
      Person.apply(foo, ['foo', 30, 'man']); 
      // Person.call(foo, 'foo', 30' man'); // call ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ
      console.dir(foo);
      
      // ๋””๋ฒ„๊น…
      > Object
        age: 30
        gender: "man"
        name: "foo"
        __proto__: Object

      apply() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•œ arguments ๊ฐ์ฒด์˜ ๋ฐฐ์—ด ํ‘œ์ค€ ๋ฉ”์„œ๋“œ slice() ํ™œ์šฉ

      function myFunction() {
          console.dir(arguments);
      
          // Array.prototype.slice() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด๋ผ. ์ด๋•Œ this๋Š” arguments ๊ฐ์ฒด๋กœ ๋ฐ”์ธ๋”ฉํ•ด๋ผ.
          var args = Array.prototype.slice.apply(arguments);
          console.dir(args);
      
          // ๋””๋ฒ„๊น…
          > Arguments[3]
            0: 1
            1: 2
            2: 3
            callee: function myFunction() {
              length: 3
            __proto__: Object
          
          > Array[3]
            0: 1
            1: 2
            2: 3
            length: 3
            __proto__: Array[0] 
      }
  • ํ•จ์ˆ˜ ๋ฆฌํ„ด

    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ ๋ฆฌํ„ด๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํŠนํžˆ, return ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋”๋ผ๋„ ๋‹ค์Œ ๊ทœ์น™์œผ๋กœ ํ•ญ์ƒ ๋ฆฌํ„ด๊ฐ’์„ ์ „๋‹ฌํ•œ๋‹ค.
      1. ์ผ๋ฐ˜ ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๋Š” ๋ฆฌํ„ด๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, undefined ๊ฐ’์ด ๋ฆฌํ„ด๋œ๋‹ค.
      2. ์ƒ์„ฑ์ž ํ•จ์ˆ˜์—์„œ ๋ฆฌํ„ด๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ๋ฆฌํ„ด๋œ๋‹ค. (๋ถˆ๋ฆฐ,์ˆซ์ž,๋ฌธ์ž์—ด๋„ ๋ฌด์‹œํ•จ) ๋‹จ, ๋ช…์‹œ์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ ๊ฒฝ์šฐ๋Š” ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Clone this wiki locally