<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>interacting</title>
    <link>https://interacting.tistory.com/</link>
    <description>  in incubating</description>
    <language>ko</language>
    <pubDate>Sun, 23 Aug 2026 14:52:51 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Carrot </managingEditor>
    <image>
      <title>interacting</title>
      <url>https://tistory1.daumcdn.net/tistory/1133494/attach/20f9c63bcb4b4d89b77ef74561ec1387</url>
      <link>https://interacting.tistory.com</link>
    </image>
    <item>
      <title>[Git] Stash 정리  </title>
      <link>https://interacting.tistory.com/174</link>
      <description>&lt;p&gt;&lt;code&gt;git stash&lt;/code&gt;를 사용하여 완료되지 않은 작업을 stash stack 에 임시 저장 할 수 있음&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;git stash&lt;/code&gt; === &lt;code&gt;git stash push&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;커밋처럼 &lt;code&gt;-m&lt;/code&gt; flag를 추가하여 메시지를 설정할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;❯ git status -s
 M working.txt # 워킹 디렉토리에 있는 파일
M  staging.txt # staging된 파일

❯ git stash push -m &amp;quot;working + staging&amp;quot;
Saved working directory and index state On master: working + staging

❯ git status -s
# 변경사항이 stash stack에 들어가면서 working &amp;amp; staging 모두 비워짐

❯ git stash list
stash@{0}: On master: working + staging
&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;code&gt;git stash apply&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Stash를 적용할 때 Staged 상태였던 파일을 자동으로 다시 Staged 상태로 만들어 주지 않는다.&lt;/em&gt;&lt;br&gt;그래서 &lt;code&gt;git stash apply&lt;/code&gt; 명령을 실행할 때 &lt;code&gt;--index&lt;/code&gt; 옵션을 주어 Staged 상태까지 적용한다. 그래야 원래 작업하던 상태로 돌아올 수 있다.&lt;/li&gt;
&lt;li&gt;위의 상황에서 &lt;code&gt;git stash apply&lt;/code&gt;를 하면&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;❯ git status -s
 M working.txt 
 M staging.txt # staged 상태였던 파일도 워킹 디렉토리로 내려옴&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git stash apply --index&lt;/code&gt;를 하면&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;❯ git status -s
 M working.txt
M staging.txt # staged 된 상태 그대로 유지&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;apply 옵션은 단순히 Stash를 적용하는 것뿐이다. Stash는 여전히 스택에 남아 있다.&lt;br&gt;&lt;code&gt;git stash drop&lt;/code&gt;명령을 사용하여 해당 Stash를 제거한다.&lt;/li&gt;
&lt;li&gt;그리고 &lt;code&gt;git stash pop&lt;/code&gt;이라는 명령도 있는데 이 명령은 Stash를 적용하고 나서 바로 스택에서 제거해준다.&lt;/li&gt;
&lt;li&gt;꼭 깨끗한 워킹 디렉토리나 Stash 할 때와 같은 브랜치에 적용해야 하는 것은 아니다.&lt;br&gt;어떤 브랜치에서 Stash 하고 다른 브랜치로 옮기고서 거기에 Stash를 복원할 수 있다.&lt;br&gt;그리고 꼭 워킹 디렉토리가 깨끗한 상태일 필요도 없다. &lt;em&gt;워킹 디렉토리에 수정하고 커밋하지 않은 파일들이 있을 때도 Stash를 적용할 수 있다&lt;/em&gt;. 만약 충돌이 있으면 알려준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;git stash push -m --keep-index&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;이 옵션을 이용하면 이미 Staging Area에 들어 있는 파일을 Stash 하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;git stash -u&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-u&lt;/code&gt; 옵션은 &lt;code&gt;—include-untracked&lt;/code&gt; 의 줄임표현이다.&lt;br&gt;언트래킹 파일들도 stashing area에 추가하고 싶을 때 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;출처&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Stashing%EA%B3%BC-Cleaning&quot;&gt;Git - Stashing과 Cleaning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;드림코딩 Git 마스터 과정&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>공부</category>
      <category>GIT</category>
      <category>Stash</category>
      <author>Carrot </author>
      <guid isPermaLink="true">https://interacting.tistory.com/174</guid>
      <comments>https://interacting.tistory.com/174#entry174comment</comments>
      <pubDate>Mon, 29 Mar 2021 01:17:23 +0900</pubDate>
    </item>
    <item>
      <title>[JS] Deep Equality checking of Two Objects</title>
      <link>https://interacting.tistory.com/170</link>
      <description>&lt;p&gt;&lt;code&gt;JSON.stringify&lt;/code&gt; 을 사용하지 않고 두 Object가 같은지 비교(deep-equal)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;i&gt;Deep Equality checking of Two Objects&lt;/i&gt;&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;function compareObjectsDeepEqual(original, target) {
  const isObject = obj =&amp;gt; typeof obj === &quot;object&quot; &amp;amp;&amp;amp; obj !== null;

  if (!isObject(original) || !isObject(target)) {
    return original === target;
  }

  const keysOfOriginal = Object.keys(original);
  const keysOfTarget = Object.keys(target);

  if (keysOfOriginal.length !== keysOfTarget.length) {
    return false;
  }

  for (let key of keysOfOriginal) {
    if (!keysOfTarget.includes(key)) {
      return false;
    }

    if (isObject(original[key])) {
      if (!compareObjectsDeepEqual(original[key], target[key])) {
        return false;
      }
    } else {
      if (original[key] !== target[key]) {
        return false;
      }
    }
  }

  return true;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;i&gt;&lt;b&gt;  테스트 케이스들&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;empty :&lt;/b&gt; &lt;code&gt;const original = {}, target = {}&lt;/code&gt; ▶ true&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;falsy value :&lt;/b&gt; &lt;code&gt;const original = { name: &quot;&quot; }, target = { name: 0 }&lt;/code&gt; ▶ false&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;nested&lt;/b&gt; ▶ true&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;const original = {
  name: &quot;Judy&quot;,
  work: {
    company: &quot;zootopia&quot;,
    since: { year: 2017, month: 1, day: 1 },
  },
};
const target = {
  name: &quot;Judy&quot;,
  work: {
    company: &quot;zootopia&quot;,
    since: { year: 2017, month: 1, day: 1 },
  },
};&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;null :&lt;/b&gt; &lt;code&gt;const original = { name: null }, target = { name: null })&lt;/code&gt; ▶ true&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Array :&lt;/b&gt; ▶ true&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;const original = { name: &quot;Judy&quot;, array: [&quot;0&quot;, &quot;1&quot;, &quot;2&quot;] };
const target = { name: &quot;Judy&quot;, array: [&quot;0&quot;, &quot;1&quot;, &quot;2&quot;] };&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Array + Type of value&lt;/b&gt; ▶ false&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;const original = { name: &quot;Judy&quot;, array: [&quot;0&quot;, &quot;1&quot;, &quot;2&quot;] };
const target = { name: &quot;Judy&quot;, array: [0, 1, 2] };&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Do not check for a property in the object's prototype chain&lt;/b&gt; ▶ false&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;Object.prototype.test = &quot;Don't check me!&quot;;

const original = { name: &quot;Judy&quot;, test: &quot;Don't check me!&quot; };
const target = { name: &quot;Judy&quot; };&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Complex nested object + array&lt;/b&gt; ▶ true&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;const original = {
 name: &quot;Judy&quot;,
 array: [{ A: &quot;apple&quot;, B: [&quot;beer&quot;, &quot;blue&quot;] }],
 string: &quot;STRING &quot;,
};
const target = {
 name: &quot;Judy&quot;,
 array: [{ A: &quot;apple&quot;, B: [&quot;beer&quot;, &quot;blue&quot;] }],
 string: &quot;STRING &quot;,
};&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start=&quot;9&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;Order of original and target (Two-way)&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;code&gt;const original = original, target)&lt;/code&gt; ▶ false&lt;br /&gt;&lt;code&gt;const original = target, original)&lt;/code&gt; ▶ false&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;const original = {
  A: &quot;apple&quot;,
  B: [&quot;beer&quot;, &quot;blue&quot;],
};
const target = {
  A: &quot;apple&quot;,
};&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>공부/JS</category>
      <category>js</category>
      <author>Carrot </author>
      <guid isPermaLink="true">https://interacting.tistory.com/170</guid>
      <comments>https://interacting.tistory.com/170#entry170comment</comments>
      <pubDate>Sun, 20 Sep 2020 02:26:36 +0900</pubDate>
    </item>
    <item>
      <title>[JS/알고리즘] Sort Colors : Dutch national flag problem</title>
      <link>https://interacting.tistory.com/169</link>
      <description>&lt;h4&gt;&lt;code&gt;Dutch national flag problem&lt;/code&gt;&lt;/h4&gt;&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;array[0] ~ [low-1] zeros (red)  
array[low] ~ [mid-1] onew (white)  
array[mid] ~ [high] unknown  
array[high+1] ~ [length-1] twos (blue)&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 모든 요소는 unknown 상태이기 때문에&lt;br&gt;low = 0&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;mid = 0&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;high = length-1&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;이다.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/cuPxVV/btqH3xvxImm/gFab6Hew9jLNMMsns4FCd0/img.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuPxVV/btqH3xvxImm/gFab6Hew9jLNMMsns4FCd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuPxVV/btqH3xvxImm/gFab6Hew9jLNMMsns4FCd0/img.png&quot; data-alt=&quot;Dutch national flag problem&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuPxVV/btqH3xvxImm/gFab6Hew9jLNMMsns4FCd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuPxVV%2FbtqH3xvxImm%2FgFab6Hew9jLNMMsns4FCd0%2Fimg.png&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/cuPxVV/btqH3xvxImm/gFab6Hew9jLNMMsns4FCd0/img.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Dutch national flag problem&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;75. Sort Colors&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Note:&lt;/b&gt; You are not suppose to use the library's sort function for this problem.&lt;/p&gt;&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Example:
Input: [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; contenteditable=&quot;false&quot; data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class=&quot;zephir&quot;&gt;&lt;code&gt;var sortColors = function (nums) {
  const { length } = nums;
  let low = 0; // red
  let mid = 0; // white
  let high = length - 1; // blue

  while (mid &amp;lt;= high) {
    if (nums[mid] === 0) {
      swap(nums, low, mid);
      low++;
      mid++;
    } else if (nums[mid] === 1) {
      mid++;
    } else {
      swap(nums, mid, high);
      high--;
    }
  }
};

function swap(array, a, b) {
  const temp = array[a];
  array[a] = array[b];
  array[b] = temp;
}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;출처1 : &lt;a href=&quot;https://en.wikipedia.org/wiki/Dutch_national_flag_problem&quot; target=&quot;_blank&quot;&gt;en.wikipedia.org/wiki/Dutch_national_flag_problem&lt;/a&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;출처2 : &lt;a href=&quot;https://www.geeksforgeeks.org/sort-an-array-of-0s-1s-and-2s/&quot; target=&quot;_blank&quot;&gt;www.geeksforgeeks.org/sort-an-array-of-0s-1s-and-2s/&lt;/a&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;출처3 : &lt;a href=&quot;https://leetcode.com/problems/sort-colors/&quot; target=&quot;_blank&quot;&gt;leetcode.com/problems/sort-colors/&lt;/a&gt;&lt;/p&gt;</description>
      <category>공부/JS</category>
      <author>Carrot </author>
      <guid isPermaLink="true">https://interacting.tistory.com/169</guid>
      <comments>https://interacting.tistory.com/169#entry169comment</comments>
      <pubDate>Mon, 7 Sep 2020 09:16:32 +0900</pubDate>
    </item>
    <item>
      <title>[JS/알고리즘]  Find First and Last Position of Element in Sorted Array</title>
      <link>https://interacting.tistory.com/168</link>
      <description>&lt;h4&gt;&lt;code&gt;BST&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;이미 sorted 된 데이터의 경우, BST를 이용해 O(log n)의 시간복잡도로 타겟을 찾을 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;34. Find First and Last Position of Element in Sorted Array&lt;/h3&gt;
&lt;p&gt;Given an array of integers &lt;code&gt;nums&lt;/code&gt; sorted in ascending order, find the starting and ending position of a given &lt;code&gt;target&lt;/code&gt; value.&lt;/p&gt;
&lt;p&gt;Your algorithm's runtime complexity must be in the order of O(log n).&lt;/p&gt;
&lt;p&gt;If the target is not found in the array, return &lt;code&gt;[-1, -1]&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Example 1:
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]

Example 2:
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const searchRange = function (nums, target) {
  const { length } = nums;
  let firstIndex = 0;
  let lastIndex = length - 1;

  while (firstIndex &amp;lt;= lastIndex) {
    const midIndex = Math.floor((firstIndex + lastIndex) / 2);

    if (nums[midIndex] === target) {
      firstIndex = midIndex;
      lastIndex = midIndex;
      break;
    }

    if (nums[midIndex] &amp;lt; target) {
      //타겟이 더 크므로 뒷부분에서 탐색
      firstIndex = midIndex + 1;
    } else {
      lastIndex = midIndex - 1;
    }
  }

  // while문을 끝까지 순회 했으나 target을 못찾은 경우
  if (firstIndex &amp;gt; lastIndex) {
    return [-1, -1];
  }

  //중간에 break되어서 나왔을 경우, 앞뒤로 같은 값 있는지 탐색
  while (nums[firstIndex - 1] === target) firstIndex--;
  while (nums[lastIndex + 1] === target) lastIndex++;

  return [firstIndex, lastIndex];
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;출처 : &lt;a href=&quot;https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/&quot;&gt;leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/&lt;/a&gt;&lt;/p&gt;</description>
      <category>공부/JS</category>
      <author>Carrot </author>
      <guid isPermaLink="true">https://interacting.tistory.com/168</guid>
      <comments>https://interacting.tistory.com/168#entry168comment</comments>
      <pubDate>Mon, 7 Sep 2020 07:29:30 +0900</pubDate>
    </item>
    <item>
      <title>[JS/알고리즘]  Merge Two Sorted Lists</title>
      <link>https://interacting.tistory.com/167</link>
      <description>&lt;h4&gt;&lt;code&gt;Linked List&lt;/code&gt; + &lt;code&gt;Merge Sort&lt;/code&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Merge sort의 기본개념은 Divide and conquer이다.&lt;br&gt;따라서 Quick sort와 마찬가지로 재귀를 통해 구현 할 수 있다.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;이미 정렬된 두 파티션들이 있다면,&lt;br&gt;두 파티션의 첫요소를 검사하여 더 작은 요소를 뺀다.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Linked List 와 연결하여서 푸는 문제이기때문에&lt;br&gt;더 작은 요소를 가지고 있는 링리를 헤드로 삼고,&amp;nbsp;&lt;br&gt;헤드로 삼은 링리의 다음 노드와, 헤드가 되지못한 링리 두가지를 다시 함수에 넣는다.&lt;/p&gt;&lt;h3&gt;21. Merge Two Sorted Lists&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;Merge two sorted linked lists and return it as a new sorted list.&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;The new list should be made by splicing together the nodes of the first two lists.&lt;/p&gt;&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;Example:
Input: 1-&amp;gt;2-&amp;gt;4, 1-&amp;gt;3-&amp;gt;4  
Output: 1-&amp;gt;1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;4&lt;/code&gt;&lt;/pre&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; contenteditable=&quot;false&quot; data-ke-style=&quot;style1&quot;&gt;&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */

/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */

const mergeTwoLists = function(l1, l2) {
  if (!l1) return l2;
  if (!l2) return l1;

  if(l1.val &amp;lt; l2.val) {
    l1.next = mergeTwoLists(l1.next, l2);
    return l1;
  } else {
    l2.next = mergeTwoLists(l1, l2.next);
    return l2;
  }
};&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://leetcode.com/problems/merge-two-sorted-lists/&quot; target=&quot;_blank&quot;&gt;leetcode.com/problems/merge-two-sorted-lists/&lt;/a&gt;&lt;/p&gt;</description>
      <category>공부/JS</category>
      <category>js</category>
      <author>Carrot </author>
      <guid isPermaLink="true">https://interacting.tistory.com/167</guid>
      <comments>https://interacting.tistory.com/167#entry167comment</comments>
      <pubDate>Mon, 7 Sep 2020 06:51:42 +0900</pubDate>
    </item>
    <item>
      <title>[JS] Promise.all()은 병렬일까 직렬일까 </title>
      <link>https://interacting.tistory.com/162</link>
      <description>&lt;p&gt;하나의 async function 내에서는 &lt;code&gt;await&lt;/code&gt; 키워드를 만날 때마다&lt;br /&gt;말 그대로 기다렸다가(await) 비동기처리가 완료 된 후 직렬로 다음 task를 처리한다.&lt;/p&gt;
&lt;p&gt;만약에 async 라이브러리를 구현했던 과제 중에 &lt;code&gt;each&lt;/code&gt;나 &lt;code&gt;times&lt;/code&gt; 처럼&lt;br /&gt;여러 비동기 task를 병렬적으로 시작시키려면 어떻게 해야할까?&lt;/p&gt;
&lt;p&gt;만약 &lt;code&gt;Promise.all&lt;/code&gt; 가 병렬로 동작한다면 요걸 쓰면 될 것 같다!!&lt;br /&gt;그래서 한번 확인해보았다.&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h4&gt;async/await 직렬처리&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function nSecondsLater(n) {
  console.log(`  n=${n} Start`);
  return new Promise((resolve, reject) =&amp;gt; {
    setTimeout(() =&amp;gt; {
      resolve(`✅ ${n} Seconds Later`);
    }, n * 1000);
  });

}

const arr = [0, 1, 2, 3]


async function asyncWaterfall() {
  for (let n of arr) {
    const promise = await nSecondsLater(n);
    console.log(promise);
  }
  console.log(&quot;DONE!&quot;);
}

asyncWaterfall();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;async/await&lt;/code&gt; : &lt;code&gt;for of&lt;/code&gt;문을 사용하여 순회 할 경우&lt;br /&gt;아래와 같이 waterfall 형태로 실행된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;asyncWaterfall.gif.gif&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;242&quot; width=&quot;346&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOEt8E/btqG78JtUBj/zc1aFrtKedwQr6ra6zuWM1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOEt8E/btqG78JtUBj/zc1aFrtKedwQr6ra6zuWM1/img.gif&quot; data-alt=&quot;asyncWaterfall&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOEt8E/btqG78JtUBj/zc1aFrtKedwQr6ra6zuWM1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bOEt8E/btqG78JtUBj/zc1aFrtKedwQr6ra6zuWM1/img.gif&quot; data-filename=&quot;asyncWaterfall.gif.gif&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;242&quot; width=&quot;346&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;asyncWaterfall&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h4&gt;Promise.all()을 이용한 병렬처리&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function asyncParallel() {
  const promises = arr.map(n =&amp;gt;
    nSecondsLater(n).then(console.log)
  );
  Promise.all(promises).then(() =&amp;gt; console.log(&quot;DONE!&quot;));
}

asyncParallel();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같이 &lt;code&gt;Promise.all()&lt;/code&gt;을 이용하여 한번에 처리할 경우&lt;br /&gt;아래와 같이 원하는 대로 병렬로 동작한다!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;asyncParallel.gif.gif&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;242&quot; width=&quot;346&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SjMCG/btqHcePVWju/X36KhkfkeKD4JnHFcCu7k0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SjMCG/btqHcePVWju/X36KhkfkeKD4JnHFcCu7k0/img.gif&quot; data-alt=&quot;asyncParallel&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SjMCG/btqHcePVWju/X36KhkfkeKD4JnHFcCu7k0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/SjMCG/btqHcePVWju/X36KhkfkeKD4JnHFcCu7k0/img.gif&quot; data-filename=&quot;asyncParallel.gif.gif&quot; data-origin-width=&quot;391&quot; data-origin-height=&quot;242&quot; width=&quot;346&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;asyncParallel&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;추가!&lt;br /&gt;+ &lt;code&gt;async/await&lt;/code&gt; 없이 waterfall 구현하기&lt;/p&gt;
&lt;pre id=&quot;code_1598133545171&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function asyncWaterfall2() {
  const promise = arr.reduce((accPromise, n) =&amp;gt; {
    return accPromise.then(() =&amp;gt; {
      return nSecondsLater(n).then(console.log);
    });
  }, Promise.resolve());
  promise.then(() =&amp;gt; console.log(&quot;DONE!&quot;));
}

asyncWaterfall2();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여전히 아직은 비동기 문법들이 익숙친 않지만 여러가지 예제코드를 자주 짜봐야겠당&lt;/p&gt;</description>
      <category>공부/JS</category>
      <category>js</category>
      <author>Carrot </author>
      <guid isPermaLink="true">https://interacting.tistory.com/162</guid>
      <comments>https://interacting.tistory.com/162#entry162comment</comments>
      <pubDate>Sat, 22 Aug 2020 21:20:57 +0900</pubDate>
    </item>
    <item>
      <title>[Udemy] JavaScript: The Advanced Concepts - 섹션 9:Asynchronous JavaScript</title>
      <link>https://interacting.tistory.com/161</link>
      <description>&lt;h2&gt;섹션 9:Asynchronous JavaScript&lt;/h2&gt;
&lt;h3&gt;132. Section Overview&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;//1
setTimeout(()=&amp;gt;{console.log('1', 'is the loneliest number')}, 0)
setTimeout(()=&amp;gt;{console.log('2', 'can be as bad as one')}, 10)

//2
Promise.resolve('hi').then((data)=&amp;gt; console.log('2', data))

//3
console.log('3','is a crowd')

// --output--
// 3 is a crowd
// 2 hi            // Promise
// -- program return undefined --
// 1 is the loneliest number    // setTimeout 0
// 2 can be as bad as one        // setTimeout 10&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Web API - DOM 이벤트 핸들러, fetch(), setTimeout() ...&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h3&gt;135. Promises&lt;/h3&gt;
&lt;p&gt;A promis is an &lt;b&gt;object&lt;/b&gt; that may produce a single value some time in the future.&lt;/p&gt;
&lt;p&gt;either &lt;b&gt;a &lt;code&gt;resolved&lt;/code&gt; value&lt;/b&gt;, or &lt;b&gt;a reason that it&amp;rsquo;s not resolved&lt;/b&gt; (&lt;code&gt;rejected&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;states : &lt;code&gt;pending&lt;/code&gt; / &lt;code&gt;fulfilled&lt;/code&gt; / &lt;code&gt;rejected&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;promises.png&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;297&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLqfoo/btqG6eEjCt0/qz48SCyKLX7iJ4sVkS0oX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLqfoo/btqG6eEjCt0/qz48SCyKLX7iJ4sVkS0oX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLqfoo/btqG6eEjCt0/qz48SCyKLX7iJ4sVkS0oX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLqfoo%2FbtqG6eEjCt0%2Fqz48SCyKLX7iJ4sVkS0oX0%2Fimg.png&quot; data-filename=&quot;promises.png&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;297&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;callback pyramid of dom&lt;/p&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;movePlayer(100, 'Left', function () {
  movePlayer(400, 'Left', function () {
    movePlayer(10, 'Right', function () {
      movePlayer(330, 'Left', function () {
      });
    });
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;콜백의 중첩 예시&lt;/p&gt;
&lt;p&gt;really really complicated code!&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h4&gt;promise exercise&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const promise = new Promise((resolve, reject) =&amp;gt; {
  if (true) {
    resolve('Stuff Worked');
  } else {
    reject('Error, it broke');
  }
});

promise
  .then(result =&amp;gt; result + '!')
  .then(result2 =&amp;gt; {
    console.log(result2);
  })&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;출력결과&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Stuff Worked!&lt;/code&gt;&lt;br /&gt;&lt;code&gt;Promise {&amp;lt;fulfilled&amp;gt;: undefined}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;then의 첫번째 인자는 앞단 promise 의 resolve 된 결과가 담김&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;promise
  .then(result =&amp;gt; {
    //throw &quot;에러1&quot;
    return result + '!'
  })
  .then(result2 =&amp;gt; {
    throw &quot;에러2&quot;
    console.log(result2);
  })
  .catch((err) =&amp;gt; console.log(err))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;.catch&lt;/code&gt;가 에러2 잡아서 출력함&lt;/p&gt;
&lt;p&gt;catch구문 이전에 있는 에러만 잡을수있음&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const promise = new Promise((resolve, reject) =&amp;gt; {
  if (false) {
    resolve('Stuff Worked');
  } else {
    reject('Error, it broke');
  }
});


// Uncaught (in promise) Error, it broke&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;.then&lt;/code&gt; 안해도 reject된값 바로나오넹..?&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h4&gt;promise all&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const promise1 = new Promise((resolve, reject) =&amp;gt; {
  setTimeout(resolve, 1000, 'ONE');
});

const promise2 = new Promise((resolve, reject) =&amp;gt; {
  setTimeout(resolve, 2000, 'TWO');
});

const promise3 = new Promise((resolve, reject) =&amp;gt; {
  setTimeout(resolve, 3000, 'THREE');
});

Promise.all([promise1, promise2, promise3])
  .then(values =&amp;gt; {
    console.log(values);
  })&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;i&gt;(3000ms 후)&lt;/i&gt; until promises were resolved&lt;/p&gt;
&lt;p&gt;&lt;code&gt;(3) [&quot;ONE&quot;, &quot;TWO&quot;, &quot;THREE&quot;]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;p&gt;&lt;code&gt;promise&lt;/code&gt;먼저 선언한담에&lt;br /&gt;3초 되기 전에 &lt;code&gt;promise.all.then&lt;/code&gt;하면 pending 상태로 나옴&lt;/p&gt;
&lt;p&gt;3초 지나고 나서 all 하면 바로 출력&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;image-20200820082839172.png&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;530&quot; width=&quot;398&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crb10A/btqG68pR9Kn/hxYDcrOrx3LIFw0bIQpaq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crb10A/btqG68pR9Kn/hxYDcrOrx3LIFw0bIQpaq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crb10A/btqG68pR9Kn/hxYDcrOrx3LIFw0bIQpaq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcrb10A%2FbtqG68pR9Kn%2FhxYDcrOrx3LIFw0bIQpaq1%2Fimg.png&quot; data-filename=&quot;image-20200820082839172.png&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;530&quot; width=&quot;398&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const urls = [
  'https://jsonplaceholder.typicode.com/users',
  'https://jsonplaceholder.typicode.com/posts',
  'https://jsonplaceholder.typicode.com/albums',
  'o_o?'
];

Promise.all(urls.map(url =&amp;gt; {
  return fetch(url).then(resp =&amp;gt; resp.json());
}))
  .then(results =&amp;gt; {
    console.log(results[0]);
    console.log(results[1]);
    console.log(results[2]);
  })
  .catch(() =&amp;gt; console.log(&quot;ERROR!&quot;));

// --output--
// Promise {&amp;lt;pending&amp;gt;}
// GET chrome-extension://laookkfknpbbblfpciffpaejjkokdgca/o_o? net::ERR_FILE_NOT_FOUND
// ERROR!&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이상한 url 이 있어서 &lt;code&gt;fetch&lt;/code&gt; 에서 오류가 나면 &lt;code&gt;catch&lt;/code&gt;로 잡을 수 있음&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;fetch('https://jsonplaceholder.typicode.com/users') // return Promise&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h3&gt;136. ES8 - Async Await&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;async function&lt;/code&gt; : a function that returns a promise.&lt;/p&gt;
&lt;p&gt;benefit of &lt;code&gt;async/await&lt;/code&gt; is that it makes code easier to read.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;1단계 : callback pyramid of dom&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;movePlayer(100, 'Left', function () {
  movePlayer(400, 'Left', function () {
    movePlayer(10, 'Right', function () {
      movePlayer(330, 'Left', function () {
      });
    });
  });
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;2단계 : Promise&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;movePlayer(100, 'Left')
  .then(() =&amp;gt; movePlayer(400, 'Left'))
  .then(() =&amp;gt; movePlayer(10, 'Right'))
  .then(() =&amp;gt; movePlayer(330, 'Left'))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;3단계 : Async/Await&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;async function playerStart() {
  const firstMove = await movePlayer(100, 'Left'); // pause
  await movePlayer(400, 'Left'); // pause
  await movePlayer(10, 'Right'); // pause
  await movePlayer(330, 'Left'); // pause
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;more realistic example&lt;/b&gt; (use &lt;code&gt;fetch&lt;/code&gt; function)&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// Promise
fetch('https://jsonplaceholder.typicode.com/users')
  .then(resp =&amp;gt; resp.json())
  .then(console.log)

// Async/Await
async function fetchUsers() {
  const response = await fetch('https://jsonplaceholder.typicode.com/users');
  const data = await response.json();
  console.log(data);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;++ &lt;code&gt;response.json()&lt;/code&gt;에 대해&lt;/p&gt;
&lt;p&gt;&lt;code&gt;response.json()&lt;/code&gt; does &lt;b&gt;return a promise&lt;/b&gt; as well (as it waits for the body to load)&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Why does .json() return a promise?&lt;/i&gt; : &lt;a href=&quot;https://stackoverflow.com/questions/37555031/why-does-json-return-a-promise&quot;&gt;https://stackoverflow.com/questions/37555031/why-does-json-return-a-promise&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;more realistic example 2&lt;/b&gt; (&lt;code&gt;Promise.all&lt;/code&gt;)&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const urls = [
  'https://jsonplaceholder.typicode.com/users',
  'https://jsonplaceholder.typicode.com/posts',
  'https://jsonplaceholder.typicode.com/albums',
];

// Promise.all
Promise.all(urls.map(url =&amp;gt;
  fetch(url).then(resp =&amp;gt; resp.json())
))
  .then(results =&amp;gt; {
    console.log(&quot;Users  : &quot;, results[0]);
    console.log(&quot;Posts  : &quot;, results[1]);
    console.log(&quot;Albums  : &quot;, results[2]);
  })
  .catch(&quot;Oooops!&quot;);

// Async/Await
const getData = async function () {
  const [users, posts, albums] =
    await Promise.all(urls.map(url =&amp;gt;
      fetch(url).then(resp =&amp;gt; resp.json())
    ));

  console.log(&quot;Users  : &quot;, users);
  console.log(&quot;Posts  : &quot;, posts);
  console.log(&quot;Albums  : &quot;, albums);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;error handing&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Promise.all&lt;/code&gt; 에서 처럼 error 발생 시, catch 하려면&lt;/p&gt;
&lt;p&gt;=&amp;gt; &lt;b&gt;use &lt;code&gt;try...catch&lt;/code&gt; block!&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// try...catch on Async/Await
const urls = [
  'https://jsonplaceholder.typicode.com/users',
  'weird url',    // 여기서 에러날거임
  'https://jsonplaceholder.typicode.com/albums',
];

const getData = async function () {
  try {

    const [users, posts, albums] =
      await Promise.all(urls.map(url =&amp;gt;
        fetch(url).then(resp =&amp;gt; resp.json())
      ));

    console.log(&quot;Users  : &quot;, users);
    console.log(&quot;Posts  : &quot;, posts);
    console.log(&quot;Albums  : &quot;, albums);

  } catch (err) {

    console.log(&quot;Oooops!&quot;, err)

  }
}

// --output-- =&amp;gt; Oooops! TypeError: Failed to fetch&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;async/await은 새로운 신택스니까 although intimidating at first 하긴 하지만&lt;br /&gt;유용하게 사용할 수 있음!!&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h3&gt;137. ES9 (ES2018)&lt;/h3&gt;
&lt;p&gt;전 버전에 비해서 알아야할 three main new features 가 있다&lt;/p&gt;
&lt;h4&gt;Object spread operator&lt;/h4&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;//Object spread operator
const animals = {
  tiger: 23,
  lion: 5,
  monkey: 2,
  quokka: 1204
}

const { tiger, ...restAnimals, quokka } = animals;
 // SyntaxError: Rest element must be last element

const { tiger, ...restAnimals } = animals;
// --output--
// tiger -&amp;gt; 23
// restAnimals -&amp;gt; {lion: 5, monkey: 2, quokka: 1204}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;function objectSpread(p1, p2, p3) {
  console.log(p1);
  console.log(p2);
  console.log(p3);
}

const { tiger, lion, ...restAnimals } = animals;

objectSpread(tiger, lion, restAnimals);
// --output--
// 23
// 5
// {monkey: 2, quokka: 1204}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h3&gt;138. ES9 (ES2018) - Async&lt;/h3&gt;
&lt;h4&gt;finally&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const urls = [
  'http://swapi.dev/api/people/1/',
  'http://swapi.dev/api/people/2/',
  'http://swapi.dev/api/people/3/',
  'http://swapi.dev/api/people/4/',
]

Promise.all(urls.map(url =&amp;gt;
  fetch(url).then(person =&amp;gt; person.json())
))
  .then(people =&amp;gt; {
    console.log('1', people[0]);
    throw Error;
    console.log('2', people[1]);
    console.log('3', people[2]);
    console.log('4', people[3]);
  })
  .catch(err =&amp;gt; console.log('ughhhhh fix it!', err))
  .finally(() =&amp;gt; console.log('extra'))

// --output--
// 1 {name: &quot;Luke Skywalker&quot;, height: &quot;172&quot;, mass: &quot;77&quot;, hair_color: &quot;blond&quot;, skin_color: &quot;fair&quot;, &amp;hellip;}
// ughhhhh fix it! &amp;fnof; Error() { [native code] }
// extra&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;finally()&lt;/code&gt; 메소드는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise&quot;&gt;&lt;code&gt;Promise&lt;/code&gt;&lt;/a&gt; 객체를 반환합니다.&lt;br /&gt;Promise가 처리되면 충족되거나 거부되는지 여부에 관계없이 지정된 콜백 함수가 실행됩니다.&lt;br /&gt;&lt;b&gt;이것은 Promise가 성공적으로 수행 되었는지 거절되었는지에 관계없이 &lt;code&gt;Promise&lt;/code&gt;가 처리 된 후에 코드가 무조건 한 번은 실행되는 것을 제공합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;요것을 쓰는 이유 : Promise의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise/then&quot;&gt;&lt;code&gt;then()&lt;/code&gt;&lt;/a&gt;과 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch&quot;&gt;&lt;code&gt;catch()&lt;/code&gt;&lt;/a&gt; 핸들러에서의 코드 중복을 피하게 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;p.then(onFulfilled, onRejected)&lt;/code&gt; 인 것과 달리&lt;br /&gt;&lt;code&gt;p.finally(onFinally)&lt;/code&gt; 요렇게 쓰임.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;onFinally에 들어가는 function은 어떠한 인수도 전달받지 않는다.&lt;br /&gt;왜냐하면 이행/거부 여부를 판단할 수 없기 때문에!&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h4&gt;for await of&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const urls = [
  'https://jsonplaceholder.typicode.com/users',
  'https://jsonplaceholder.typicode.com/posts',
  'https://jsonplaceholder.typicode.com/albums',
];

const getData = async function () {
  try {
    const [users, posts, albums] =
      await Promise.all(urls.map(url =&amp;gt; {
        const response = await fetch(url);
        return response.json();
      }));

    console.log(&quot;Users  : &quot;, users);
    console.log(&quot;Posts  : &quot;, posts);
    console.log(&quot;Albums  : &quot;, albums);
  } catch (err) {
    console.log('Ooooops!!', err);
  }
}

// do exactly what this one does above by 
// using by &quot;for await of&quot;
const getData2 = async function () {
  const arrayOfPromises = urls.map(url =&amp;gt; fetch(url));

  for await (let request of arrayOfPromises) {
    const data = await request.json();
    console.log(data);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;Promise.all&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise/all&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise/all&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;반환한 프로미스의 이행 결과값은 (프로미스가 아닌 값을 포함하여) 매개변수로 주어진 순회 가능한 객체에 포함된 &lt;b&gt;모든&lt;/b&gt; 값을 담은 배열입니다.&lt;/p&gt;
&lt;p&gt;주어진 프로미스 중 하나라도 거부하면, 다른 프로미스의 이행 여부에 상관없이 첫 번째 거부 이유를 사용해 거부합니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Promise.all&lt;/code&gt;은 주어진 순회 가능한 객체가 비어있는 경우에만 동기적으로 이행됩니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;var p = Promise.all([]); // 즉시 이행함
var p2 = Promise.all([1337, &quot;hi&quot;]); // 프로미스가 아닌 값은 무시하지만 비동기적으로 실행됨
console.log(p);
console.log(p2);
setTimeout(function() {
    console.log('the stack is now empty');
    console.log(p2);
});

// 출력
// Promise { &amp;lt;state&amp;gt;: &quot;fulfilled&quot;, &amp;lt;value&amp;gt;: Array[0] } // p
// Promise { &amp;lt;state&amp;gt;: &quot;pending&quot; } // p2
// the stack is now empty
// Promise { &amp;lt;state&amp;gt;: &quot;fulfilled&quot;, &amp;lt;value&amp;gt;: Array[2] } // p2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;--- MDN 예제가 매우 도움이 되는구만☺&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h3&gt;139. Job Queue&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Promise&lt;/code&gt;는 최근에 추가되어서&lt;br /&gt;이 추가사항을 수용accommodate 하기 위해서&lt;br /&gt;기존의 Event Loop를 변경해야했다.&lt;/p&gt;
&lt;p&gt;ECMA script에서는 Promise 를 위해서 원래 가지고 있던 Callback Queue 을 사용하는 것 대신에 다른 큐가 필요하다고 했다.&lt;/p&gt;
&lt;p&gt;그거슨 바로 &amp;lsquo;Job Queue&amp;rsquo;이다! (혹은 Microtask Queue)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Job Queue는 콜백큐에 비해서 smaller 하지만 더 높은 우선순위를 가진다.&lt;br /&gt;(Event Loop가 처리할 때)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;JAVASCRIPT RUNTIME 다이어그램을 다시 보자&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;js_runtime.png&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;760&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfYI6f/btqHcd4Xu0H/Wj3dbys31IEi0id99RvEqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfYI6f/btqHcd4Xu0H/Wj3dbys31IEi0id99RvEqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfYI6f/btqHcd4Xu0H/Wj3dbys31IEi0id99RvEqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfYI6f%2FbtqHcd4Xu0H%2FWj3dbys31IEi0id99RvEqk%2Fimg.png&quot; data-filename=&quot;js_runtime.png&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;760&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Event Loop 는 먼저 Jop Queue 를 체킹하고&lt;br /&gt;콜스택이 비었을때 요거 먼저 처리한다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// Callback Queue
setTimeout(() =&amp;gt; {
  console.log('1', 'is the loneliest number')
}, 0);
setTimeout(() =&amp;gt; {
  console.log('2', 'can be as bad as one')
}, 0);

// 2 Job Queue - Microtask Queue
Promise.resolve('hi').then((data) =&amp;gt; console.log('2', data));

// 3
console.log('3', 'is a crowd');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;---output---&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3 is a crowd&lt;/b&gt; &amp;gt;&amp;gt; 비동기가 아닌 애는 먼저 처리되고&lt;br /&gt;&lt;b&gt;2 hi&lt;/b&gt; &amp;gt;&amp;gt; 이벤트큐: 헤이잡큐!! 뭐갖고있는거있니? / 잡큐: ㅇㅇ이거있엉&lt;br /&gt;&lt;b&gt;undefined&lt;/b&gt; &amp;gt;&amp;gt; JS file 끗&lt;br /&gt;&lt;b&gt;1 is the loneliest number&lt;/b&gt; &amp;gt;&amp;gt; 이벤트큐: 헤이잡큐!! 뭐갖고있는거있니? / 잡큐: ㄴㄴ없엉!! 이제 콜백큐한테 가도돼!!&lt;br /&gt;&lt;b&gt;2 can be as bad as one&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;어떤 레거시 브라우저는 잡큐가 없기도하지만 대부분 스탠다드를 따른다.&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h3&gt;140. Parallel, Sequence and Race&lt;/h3&gt;
&lt;p&gt;multiple promises를 처리하는데 있어서 세 가지 방법이 있다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;in parallel&lt;/b&gt; (start all at the same time)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;sequential&lt;/b&gt; (they're all dependent on each other)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;race&lt;/b&gt; (one comes back first and ignores the rest.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;const promisify = (item, delay) =&amp;gt;
  new Promise((resolve) =&amp;gt;
    setTimeout(() =&amp;gt;
      resolve(item), delay));

const a = () =&amp;gt; promisify('a', 100);
const b = () =&amp;gt; promisify('b', 5000);
const c = () =&amp;gt; promisify('c', 3000);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 3개의 multiple promises를 각 방법으로 처리해보자&lt;/p&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h4&gt;1) Parallel&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;async function parallel() {
  const promises = [a(), b(), c()];
  const [output1, output2, output3] = await Promise.all(promises);
  return `parallel is done: ${output1} ${output2} ${output3}`
}

parallel().then(console.log);

// --output--
// (0초후) Promise {&amp;lt;pending&amp;gt;}
// (5초후) parallel is done: a b c&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h4&gt;2) Race&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;async function race() {
  const promises = [a(), b(), c()];
  const output1 = await Promise.race(promises);
  return `race is done: ${output1}`;
}

race().then(console.log);

// -- output --
// (  0초후) Promise {&amp;lt;pending&amp;gt;}
// (0.1초후) race is done: a&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h4&gt;3) Sequential&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;async function sequence() {
  const output1 = await a();
  const output2 = await b();
  const output3 = await c();
  return `sequence is done ${output1} ${output2} ${output3}`
}

sequence().then(console.log);
// -- output --
// (  0초후) Promise {&amp;lt;pending&amp;gt;}
// (8.1초후) sequence is done a b c&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h4&gt;+ 셋 다 한꺼번에 하면...?&lt;/h4&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;parallel().then(console.log);
sequence().then(console.log);
race().then(console.log);

// -- output --
// (  0초후) 01:12:56.033 Promise {&amp;lt;pending&amp;gt;}
// (0.1초후) 01:12:56.139 race is done: a
// (  5초후) 01:13:01.033 parallel is done: a b c
// (8.1초후) 01:13:04.166 sequence is done a b c&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;출처 : Udemy - JavaScript: The Advanced Concept&lt;br /&gt;&lt;span&gt;&lt;a href=&quot;https://www.udemy.com/course/advanced-javascript-concepts&quot;&gt;https://www.udemy.com/course/advanced-javascript-concepts&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>공부/priv | 강의노트</category>
      <author>Carrot </author>
      <guid isPermaLink="true">https://interacting.tistory.com/161</guid>
      <comments>https://interacting.tistory.com/161#entry161comment</comments>
      <pubDate>Sat, 22 Aug 2020 21:18:30 +0900</pubDate>
    </item>
    <item>
      <title>[Udemy] JavaScript: The Advanced Concepts - 섹션 3:Javascript Foundation II</title>
      <link>https://interacting.tistory.com/160</link>
      <description>&lt;p style=&quot;position: absolute;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;i&gt;** ⚠ &lt;code&gt;priv | 강의노트&lt;/code&gt; 카테고리에 있는 내용은 발행이 목적이 아니기 때문에 전혀 정제되어있지 않습니당.**&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;섹션 3:Javascript Foundation II&lt;/h2&gt;
&lt;h3&gt;29. Execution Context&lt;/h3&gt;
&lt;h4&gt;Creation Phase&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;argument object created with any arguments&lt;/li&gt;
&lt;li&gt;initializes &lt;i&gt;&lt;code&gt;this&lt;/code&gt;&lt;/i&gt; keyword to point called or to the global object if not specified&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Executing Phase&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Variable Environment created - &lt;i&gt;memory space for variable and functions created&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;initializes all variables to &lt;i&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;/i&gt; and places them into memory with any new functions&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;35. Function Invocation&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// Function Expression
var canada = () =&amp;gt; {
  console.log('cold');
}

// Function Declaration
function india() {
  console.log('warm');
}

// Function Invocation/Call/Execution
canada();
india();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;canada function (Function Expression) is defined at runtime&lt;br /&gt;when we actually run/call/execute/invoke the function.&lt;/p&gt;
&lt;p&gt;ㄴ 함수표현식은 runtime 때 정의됨.&lt;br /&gt;&lt;code&gt;변수 호이스팅&lt;/code&gt;이 일어나므로 &lt;code&gt;canada&lt;/code&gt;라는 변수가 &lt;code&gt;undefined&lt;/code&gt;로 생성되었다가, 함수가 실제로 실행될 때 내용이 변수에 담김&lt;/p&gt;
&lt;p&gt;india function (Function Declaration) 은 &lt;code&gt;함수 호이스팅&lt;/code&gt;이 일어나서&lt;br /&gt;호이스팅되면서 내용이 바로 정의됨&lt;/p&gt;
&lt;p&gt;That is when the compiler initially looks at the code&lt;br /&gt;and starts hoisting and allocating memory.&lt;/p&gt;
&lt;p&gt;글고 얘는 실행컨텍스트가 만들어질때 (긍께 함수가 실행되는 순간),&lt;br /&gt;this 키워드랑 arguments 도 같이 만들어짐&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;36. arguments Keyword&lt;/h3&gt;
&lt;p&gt;글로벌 컨텍스트말고 걍 함수 실행될 때 사용 가능&lt;br /&gt;글로벌 컨텍스트에서 사용하면 에러남 (arguments is not defined)&lt;/p&gt;
&lt;p&gt;The keyword &lt;code&gt;arguments&lt;/code&gt; can be dangerous to use in your code as is. In ES6, a few methods were introduced that can help better use arguments. =&amp;gt; &lt;code&gt;...arg&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;얜 array가 아니라 array like object임&lt;/p&gt;
&lt;p&gt;그래서 array 메서드못씀&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;var args = Array.from(arguments);
var args = [...arguments];    // 펼치기 연산자, 전개 구문&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4&gt;Rest Parameters&lt;/h4&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;function f(a, b, ...theArgs) {
  // ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;함수의 마지막 파라미터의 앞에 &lt;code&gt;...&lt;/code&gt; 를 붙여 (사용자가 제공한) 모든 나머지 인수를 &quot;표준&quot; 자바스크립트 배열로 대체합니다. 마지막 파라미터만 &quot;Rest 파라미터&quot; 가 될 수 있습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rest 파라미터는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array&quot;&gt;&lt;code&gt;Array&lt;/code&gt;&lt;/a&gt; 인스턴스로, &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort&quot;&gt;&lt;code&gt;sort&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach&quot;&gt;&lt;code&gt;forEach&lt;/code&gt;&lt;/a&gt; 또는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/pop&quot;&gt;&lt;code&gt;pop&lt;/code&gt;&lt;/a&gt; 같은 메서드가 바로 인스턴스에 적용될 수 있음을 뜻합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;단, Rest파라미터는 항상 제일 마지막 파라미터로 있어야 한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ES6 의 arrow function 에서는 &lt;code&gt;arguments&lt;/code&gt; 프로퍼티가 아예 없음&lt;br /&gt;따라서 화살표 함수로 가변 인자 함수를 구현해야 할 때는 반드시 rest 파라미터를 사용해야 한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;​ &lt;b&gt;++ spread 연산자&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function sandwich(a, b, c) {
  console.log(a); // ' '
  console.log(b); // ' '
  console.log(c); // ' '
}

const food = [' ', ' ', ' '];

// Old way
sandwich.apply(null, food);

// ✅ ES6 way
sandwich(...food);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;i&gt;앞에서 살펴본 Rest 파라미터는 &lt;u&gt;&lt;b&gt;Spread 문법을 사용하여 파라미터를 정의한 것&lt;/b&gt;&lt;/u&gt;을 의미한다. 형태가 동일하여 혼동할 수 있으므로 주의가 필요하다.&lt;/i&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;// spread 문법에 의해 분리된 배열의 요소는 개별적인 인자로서 각각의 매개변수에 전달된다.
foo(1, ...[2, 3], 4, ...[5]);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://poiemaweb.com/es6-extended-parameter-handling&quot;&gt;https://poiemaweb.com/es6-extended-parameter-handling&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;37. Variable Environment&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function one() {
  var isValid = true; // local env
  console.log(&quot;one: &quot;, isValid);  // true
  two(); // new execution context!
}

function two() {
  var isValid; // undefined
  console.log(&quot;two: &quot;, isValid);  // undefined
}

var isValid = false; // global
console.log(&quot;글로벌: &quot;, isValid); // false

one();

/*
   two() isValid = undefined
   one() isValid = true
   global() isValid = false
   ------------------------
   CALL STACK
*/&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;38. Scope Chain&lt;/h3&gt;
&lt;h3&gt;39. [[scope]]&lt;/h3&gt;
&lt;p&gt;The &lt;b&gt;execution context&lt;/b&gt; tells the engine&lt;br /&gt;&lt;b&gt;which lexical environment it is currently working in&lt;/b&gt;&lt;br /&gt;and the lexical scope determines &lt;b&gt;the available variables.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;스코프체인을 통해 부모env의 변수에 접근이 가능하다.&lt;/p&gt;
&lt;p&gt;Lexical Environment === [[scope]]&lt;/p&gt;
&lt;p&gt;&lt;code&gt;[[scopes]]&lt;/code&gt; 프로퍼티를 통해서 스코프체인확인 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;image-20200815024709119.png&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;455&quot; width=&quot;778&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp1cqp/btqGHaaqpLx/EOVlpFaerAcOivjDaqfNT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp1cqp/btqGHaaqpLx/EOVlpFaerAcOivjDaqfNT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp1cqp/btqGHaaqpLx/EOVlpFaerAcOivjDaqfNT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp1cqp%2FbtqGHaaqpLx%2FEOVlpFaerAcOivjDaqfNT0%2Fimg.png&quot; data-filename=&quot;image-20200815024709119.png&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;455&quot; width=&quot;778&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;image-20200815024747827.png&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;253&quot; width=&quot;777&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zpd7G/btqGIg8RSbs/bUndODOM1jBprOYLpnJPd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zpd7G/btqGIg8RSbs/bUndODOM1jBprOYLpnJPd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zpd7G/btqGIg8RSbs/bUndODOM1jBprOYLpnJPd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZpd7G%2FbtqGIg8RSbs%2FbUndODOM1jBprOYLpnJPd1%2Fimg.png&quot; data-filename=&quot;image-20200815024747827.png&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;253&quot; width=&quot;777&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;40. Exercise: JS is Weird&lt;/h3&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;function weird() {
  height = 50;    //  
  return height;
}

weird();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2번째 줄에서 일어나는일&lt;br /&gt;&lt;i&gt;weird :ㅇㅁㅇ? our variable env에는 &lt;code&gt;height&lt;/code&gt;가 없어..&lt;br /&gt;&lt;/i&gt;그러고 글로벌 env로 가서 물어봄&lt;br /&gt;&lt;i&gt;글로벌 : ㅇㅁㅇ? 나도 없어 근데 하나필요하다니까 하나만들어드림&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;그니까 weird 함수의 variable env 에 저장되는게 아님..&lt;br /&gt;We call this leakage of global variables.&lt;/p&gt;
&lt;p&gt;저 코드를 실제로 실행해보면&lt;br /&gt;&lt;code&gt;window.height&lt;/code&gt; 라고 전역객체에 생성되어잇듬...!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;image-20200815030448421.png&quot; data-origin-width=&quot;265&quot; data-origin-height=&quot;298&quot; width=&quot;194&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YN28z/btqGFb8xNRd/tfE1K5mfuJ0zRUYrIhRkV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YN28z/btqGFb8xNRd/tfE1K5mfuJ0zRUYrIhRkV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YN28z/btqGFb8xNRd/tfE1K5mfuJ0zRUYrIhRkV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYN28z%2FbtqGFb8xNRd%2FtfE1K5mfuJ0zRUYrIhRkV0%2Fimg.png&quot; data-filename=&quot;image-20200815030448421.png&quot; data-origin-width=&quot;265&quot; data-origin-height=&quot;298&quot; width=&quot;194&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;요거 방지하려면 &lt;code&gt;&amp;lsquo;use strict&amp;rsquo;&lt;/code&gt;을 쓰면 됨&lt;br /&gt;고러면 height is not defined 라고 레퍼런스에러가 남&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;함수표현식에서 익명함수가 아니라 기명함수를 쓰면&lt;/p&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;var hey = function doodle(){
    // doodle();
    return &quot;HEY&quot;;
}

hey();
doodle();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;doodle안에서 doodle이라는 이름으로 자기자신(함수)에는 접근 가능하지만&lt;br /&gt;외부에서는 doodle로 접근 못함&lt;/p&gt;
&lt;p&gt;긍께 &lt;code&gt;doodle&lt;/code&gt; 이라는 이름은 자기자신의 스코프에 enclosed 되어있음&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;image-20200815031526506.png&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;175&quot; width=&quot;453&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rtHWM/btqGDPq72n0/OFma5oLb0oFMqEoBiPz6jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rtHWM/btqGDPq72n0/OFma5oLb0oFMqEoBiPz6jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rtHWM/btqGDPq72n0/OFma5oLb0oFMqEoBiPz6jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrtHWM%2FbtqGDPq72n0%2FOFma5oLb0oFMqEoBiPz6jk%2Fimg.png&quot; data-filename=&quot;image-20200815031526506.png&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;175&quot; width=&quot;453&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p&gt;&lt;code&gt;hey&lt;/code&gt; 는 글로벌 컨텍스트에 있기땜시&lt;br /&gt;글로벌에서도 hey로 부를 수 있고&lt;br /&gt;당근 doodle 안에서도 hey로 부를 수 있음&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;43. Global Variables&lt;/h3&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;    &amp;lt;script&amp;gt;var x = 1;&amp;lt;/script&amp;gt;
    &amp;lt;script&amp;gt;var y = 2;&amp;lt;/script&amp;gt;
    &amp;lt;script&amp;gt;var z = 3;&amp;lt;/script&amp;gt;
    &amp;lt;script&amp;gt;var x = 5000;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;전역변수를 지양해야함&lt;br /&gt;다른 파일에서도 정의하면 앞선 전역변수x를 overwrite하게됨&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Avoid polluting the global namespace or scope when possible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;44. IIFE&lt;/h3&gt;
&lt;p&gt;IIFE - Immediately Invoked Function Expression 즉시실행함수&lt;/p&gt;
&lt;p&gt;로컬스코프안에 가두기위해 사용&lt;/p&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;var script1 = (function () {
  function foo() { return &quot;Hi&quot;; }
  return { foo };
})();

script1.foo();    // Hi&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이런식으로도 사용 가능&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;출처 : Udemy - JavaScript: The Advanced Concept&lt;br /&gt;&lt;span&gt;&lt;a href=&quot;https://www.udemy.com/course/advanced-javascript-concepts&quot;&gt;https://www.udemy.com/course/advanced-javascript-concepts&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>공부/priv | 강의노트</category>
      <author>Carrot </author>
      <guid isPermaLink="true">https://interacting.tistory.com/160</guid>
      <comments>https://interacting.tistory.com/160#entry160comment</comments>
      <pubDate>Sat, 15 Aug 2020 02:27:17 +0900</pubDate>
    </item>
    <item>
      <title>[Udemy] JavaScript: The Advanced Concepts - 섹션 15:Appendix II: Intermediate Javascript</title>
      <link>https://interacting.tistory.com/159</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;i&gt;** ⚠ &lt;code&gt;priv | 강의노트&lt;/code&gt; 카테고리에 있는 내용은 발행이 목적이 아니기 때문에 전혀 정제되어있지 않습니당.**&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;섹션 15:Appendix II: Intermediate Javascript&lt;/h2&gt;
&lt;h3&gt;207. Advanced Functions&lt;/h3&gt;
&lt;h4&gt;Closures&lt;/h4&gt;
&lt;p&gt;a function ran. the function executed. It&amp;rsquo;s never going to execute again.&lt;br /&gt;&lt;b&gt;BUT&lt;/b&gt; it&amp;rsquo;s going remember that there reference to those variables.&lt;br /&gt;so the child scope always access to the parent scope.&lt;/p&gt;
&lt;h4&gt;Currying&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const multiply  = (a,b) =&amp;gt; a*b;
const curriedMultiply = (a) =&amp;gt; (b) =&amp;gt; a*b;
curriedMultiply(3);    // this part returns a function &quot;(b) =&amp;gt; 3*b&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Compose&lt;/h4&gt;
&lt;pre class=&quot;lisp&quot;&gt;&lt;code&gt;const compose = (f,g) =&amp;gt; (a) =&amp;gt; f(g(a));

const sum = (num) =&amp;gt; num + 1;

compose(sum, sum)(5);    // result : 7&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;+&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;Avoiding Side Effects, functional purity!&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;557&quot; data-filename=&quot;image-20200813033329944.png&quot; width=&quot;816&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U2kjj/btqGxPxN8ad/m0KTItzDXghVjQenNcaK91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U2kjj/btqGxPxN8ad/m0KTItzDXghVjQenNcaK91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U2kjj/btqGxPxN8ad/m0KTItzDXghVjQenNcaK91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU2kjj%2FbtqGxPxN8ad%2Fm0KTItzDXghVjQenNcaK91%2Fimg.png&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;557&quot; data-filename=&quot;image-20200813033329944.png&quot; width=&quot;816&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;avoiding side effects and always returning we create something that we call deterministic .&lt;/p&gt;
&lt;p&gt;deterministic - &lt;i&gt;결정론적&lt;/i&gt;&lt;br /&gt;같은 input이면 항상 same value 를 리턴한다.&lt;/p&gt;
&lt;p&gt;It's a very important concept and that's a key principle in avoiding bugs.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;208. Advanced Arrays&lt;/h3&gt;
&lt;p&gt;square brackets []&lt;/p&gt;
&lt;p&gt;&lt;code&gt;map&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt;, &lt;code&gt;reduce&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;pure simple functions&lt;/p&gt;
&lt;p&gt;It always returns of value.&lt;br /&gt;And there are no side effects.&lt;/p&gt;
&lt;p&gt;we&amp;rsquo;re not changing the array.&lt;br /&gt;just making a new copy of the array.&lt;br /&gt;&lt;b&gt;never mutating the data&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;209. Advanced Objects&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;reference type&lt;/b&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;&lt;code&gt;context&lt;/code&gt; vs &lt;code&gt;scope&lt;/code&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;instantiation&lt;/b&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;class Player {
  constructor(name, type) {
    console.log(&quot;Player &quot;, this);
    this.name = name;
    this.type = type;
  }
  introduce() {
    console.log(`Hi I am ${this.name}, I am a ${this.type}`);
  }
}

class Wizard extends Player {
  constructor(name, type) {
    //console.log(&quot;Wizard &quot;, this); // 이렇게쓰면 에러남
    // Uncaught ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
    super(name, type);
    console.log(&quot;Wizard &quot;, this);
  }
  play() {
    console.log(`WEEEEEE I'm a ${this.type}`);
  }
}

const wizard1 = new Wizard(&quot;Judy&quot;, &quot;Dark Wizard&quot;);
const wizard2 = new Wizard(&quot;Nick&quot;, &quot;Healer&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;wizard1.play(); // WEEEEEE I'm a Dark Wizard
wizard2.introduce(); // Hi I am Nick, I am a Healer&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;image-20200813041351300.png&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;352&quot; width=&quot;434&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCOg1e/btqGyvy27fp/bsfnjPUi10dFxgKG1k5qn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCOg1e/btqGyvy27fp/bsfnjPUi10dFxgKG1k5qn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCOg1e/btqGyvy27fp/bsfnjPUi10dFxgKG1k5qn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCOg1e%2FbtqGyvy27fp%2FbsfnjPUi10dFxgKG1k5qn1%2Fimg.png&quot; data-filename=&quot;image-20200813041351300.png&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;352&quot; width=&quot;434&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Uncaught ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;파생된 클래스에서 this 에 접근하려면&lt;br /&gt;super 생성자를 먼저 호출해야지만 가능하다.&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// classical inheritance

var Player = function(name, type) {
    this.name = name;
    this.type = type;
}

Player.prototype.introduce = function {
    console.log(`Hi I am ${this.name}, I am a ${this.type}`);
}

var wizard1 = new Player(&quot;Judy&quot;, &quot;Dark Wizard&quot;);
var wizard2 = new Player(&quot;Nick&quot;, &quot;Healer&quot;);

wizard1.play = function(){
    console.log(`WEEEEEE I'm a ${this.type}`);
};

wizard2.play = function(){
    console.log(`WEEEEEE I'm a ${this.type}`);
};&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;210. ES7&lt;/h3&gt;
&lt;p&gt;ES7은 별거 없음&lt;/p&gt;
&lt;p&gt;ES6는 뭐가 많이 바뀌었었는데 ES7은 두개 추가댐&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;&lt;b&gt;&lt;code&gt;.includes()&lt;/code&gt; method&lt;/b&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;added on string and array&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;const pets = [&quot;cat&quot;, &quot;dog&quot;, &quot;bat&quot;];
pets.includes(&quot;dog&quot;);    // true
pets.includes(&quot;bird&quot;);    // false

&quot;Hello&quot;.includes(&quot;o&quot;);    // true
&quot;Hello&quot;.includes(&quot;a&quot;);    // false&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;
&lt;h4&gt;&lt;b&gt;exponential operator&lt;/b&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;const square = (x) =&amp;gt; x**2;
square(2);    // 4
square(5);    // 25

const cube = (y) =&amp;gt; y**3;
cube(3);    // 27
cube(4);    // 64

console.log(10 ** -2);    // 0.01&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The exponentiation operator (&lt;code&gt;**&lt;/code&gt;) returns the result of raising the first operand to the power of the second operand.&lt;/p&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;211. ES8&lt;/h3&gt;
&lt;p&gt;ES7보다는 좀더바뀌긴함&lt;br /&gt;중요한 몇개만 살펴봄&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;&lt;b&gt;padStart&lt;/b&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;str.padStart(targetLength [, padString])&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.padEnd()&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;scheme&quot;&gt;&lt;code&gt;'abc'.padStart(10);         // &quot;       abc&quot;
'abc'.padStart(10, &quot;foo&quot;);  // &quot;foofoofabc&quot;
'abc'.padStart(6,&quot;123465&quot;); // &quot;123abc&quot;
'abc'.padStart(8, &quot;0&quot;);     // &quot;00000abc&quot;
'abc'.padStart(1);          // &quot;abc&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;
&lt;h4&gt;&lt;b&gt;Trailing commas in functions&lt;/b&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ECMAScript 2017 allows trailing commas in function parameter lists.&lt;/p&gt;
&lt;p&gt;the ending comma is now valid&lt;/p&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;function f(p) {}
function f(p,) {} 

(p) =&amp;gt; {};
(p,) =&amp;gt; {};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;원래는 배열리터럴에서만 허용됐었고,&lt;br /&gt;ES5에서 객체리터럴에서도 허용됨,&lt;br /&gt;ES7부터 함수의 파라미터에도 허용됨&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Trailing_commas&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Trailing_commas&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;-&amp;gt; 버전 관리 이력이 간단해지고 코드 편집이 더 편해진다는 장점이 있습니다.&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;
&lt;h4&gt;&lt;code&gt;Object.values&lt;/code&gt;, &lt;code&gt;Object.entries&lt;/code&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Object.values : 객체가 가지는 (열거 가능한) 속성의 값들로 이루어진 배열을 리턴합니다.&lt;/p&gt;
&lt;p&gt;Object.entries : 객체가 가지는 (열거 가능한) 속성의 &lt;code&gt;[key, value]&lt;/code&gt; 쌍의 배열을 반환합니다.&lt;/p&gt;
&lt;p&gt;Obj 를 배열로 변환해서 사용&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;let obj = {
  username0 : &quot;Santa&quot;,
  username1 : &quot;Rudolf&quot;,
  username2 : &quot;Mr.Grinch&quot;,
}

Object.keys(obj).forEach((key, index) =&amp;gt; {
  console.log(key, obj[key], index);
});
// username0 Santa 0
// username1 Rudolf 1
// username2 Mr.Grinch 2

Object.values(obj).forEach((value) =&amp;gt; {
  console.log(value);
});
// Santa
// Rudolf
// Mr.Grinch

Object.entries(obj);
// [ 
//   [&quot;username0&quot;, &quot;Santa&quot;], 
//   [&quot;username1&quot;, &quot;Rudolf&quot;], 
//   [&quot;username2&quot;, &quot;Mr.Grinch&quot;]
// ]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;Object.entries(obj).map(val =&amp;gt; val[1]+val[0].replace(&quot;username&quot;, &quot;&quot;));

//[&quot;Santa0&quot;, &quot;Rudolf1&quot;, &quot;Mr.Grinch2&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;213. ES10 (ES2019)&lt;/h3&gt;
&lt;h4&gt;&lt;code&gt;arr.flat()&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;nested Array -&amp;gt; flat Array (중첩배열 평탄화)&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[1,[2,3],[4,5]].flat()

// [ 1,2,3,4,5 ]&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[1, 2,[3,4,[5]]].flat()

// [ 1, 2, 3, 4, [5] ]

[1, 2,[3,4,[5]]].flat(2)
// [1, 2, 3, 4, 5]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;arr.flat(depth)&lt;/code&gt;&lt;br /&gt;depth기본값은 1&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/flat&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/flat&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;const arr5 = [1, 2, , , 5, 6];
arr5.flat();
// [1, 2, 5, 6] 배열의 구멍도 제거&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;// Turn the trapped 3 number into: [3]
const trapped = [[[[[[[[[[[[[[[[[[[[[[[[[[3]]]]]]]]]]]]]]]]]]]]]]]]]];

//Solution
console.log(trapped.flat(Infinity))
// Infintiy is actually a LARGE number in JavaScipt. 
// It represents the maximum amount of memory that we can hold for a number! 
// Learn more here: 
// https://riptutorial.com/javascript/example/2337/infinity-and--infinity&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;const jurassicPark = [
  [&quot; &quot;, &quot; &quot;],
  &quot; &quot;,
  &quot; &quot;,
  [[&quot; &quot;, &quot; &quot;]],
  [[[[&quot; &quot;]]]],
  [&quot; &quot;, &quot; &quot;]
];

jurassicPark.flat(50);
// (9) [&quot; &quot;, &quot; &quot;, &quot; &quot;, &quot; &quot;, &quot; &quot;, &quot; &quot;, &quot; &quot;, &quot; &quot;, &quot; &quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;arr.flatMap()&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;이는 깊이 1의 flat 이 뒤따르는 map 과 동일하지만, flatMap 은 아주 유용하며 둘을 하나의 메소드로 병합할 때 조금 더 효율적입니다.&lt;/p&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;const jurassicParkChaos = jurassicPark.flatMap(
  creature =&amp;gt; creature + &quot; &quot;
);

// jurassicParkChaos
//(6) [&quot; , &quot;, &quot; &quot;, &quot; &quot;, &quot; , &quot;, &quot; &quot;, &quot; , &quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;str.trimStart()&lt;/code&gt;&lt;/h4&gt;
&lt;pre class=&quot;abnf&quot;&gt;&lt;code&gt;const userEmail1 = &quot;        judy@email.com&quot;;
const userEmail2 = &quot;nick@email.com        &quot;;

userEmail1.trimStart();
// &quot;judy@email.com&quot;

userEmail2.trimEnd();
// &quot;nick@email.com&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;Object.fromEntries&lt;/code&gt;&lt;/h4&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;const inventory = [
  [&quot;potato&quot;, 23],
  [&quot;apple&quot;, 40],
  [&quot;broccoli&quot;, 15]
];

const obj = Object.fromEntries(inventory);
// {potato: 23, apple: 40, broccoli: 15}

Object.entries(obj);
// 이렇게 하면 inventory랑 같은 모양으로 다시 바뀜
// 긍께 fromEntries &amp;lt;-&amp;gt; entries 이런 늬낌&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;try&lt;/code&gt; &amp;amp; &lt;code&gt;catch&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;catch(error) 에서 error 파라미터 생략가능&lt;/p&gt;
&lt;h3&gt;214. Advanced Loops&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;for of&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;iterating&lt;/b&gt; - array, strings&lt;br /&gt;we are able to iterate over individual items&lt;/p&gt;
&lt;pre class=&quot;xquery&quot;&gt;&lt;code&gt;for (item of obj){ console.log(item);} 
// Uncaught TypeError: obj is not iterable&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;for in&lt;/code&gt; - properties&lt;/p&gt;
&lt;p&gt;&lt;b&gt;enumerating&lt;/b&gt; - object&lt;/p&gt;
&lt;p&gt;enumerable&lt;br /&gt;( enumerate : 열거하다)&lt;/p&gt;
&lt;p&gt;it allows us to see the property&lt;/p&gt;
&lt;h3&gt;216. Modules&lt;/h3&gt;
&lt;p&gt;code reusablility&lt;/p&gt;
&lt;p&gt;global namespace&lt;/p&gt;
&lt;p&gt;dependency resolution&lt;/p&gt;
&lt;p&gt;Inline Script -&amp;gt; Script Tags -&amp;gt; IIFE -&amp;gt;&lt;/p&gt;
&lt;h4&gt;Common JS + browserify&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// js1
module.exports = function add (a,b){
    return a + b;
};

// js2
var add = require(&quot;./add&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;module bundler&lt;/p&gt;
&lt;h4&gt;ES6 + Webpack2&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// js1
export const add = (a,b) =&amp;gt; A + b;
// or
export default function add() {
    return a + b;
}

// js2
import { add } from &quot;./add&quot;;
// or
import add from &quot;./add&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;출처 : Udemy - JavaScript: The Advanced Concept&lt;br /&gt;&lt;span&gt;&lt;a href=&quot;https://www.udemy.com/course/advanced-javascript-concepts&quot;&gt;https://www.udemy.com/course/advanced-javascript-concepts&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>공부/priv | 강의노트</category>
      <author>Carrot </author>
      <guid isPermaLink="true">https://interacting.tistory.com/159</guid>
      <comments>https://interacting.tistory.com/159#entry159comment</comments>
      <pubDate>Thu, 13 Aug 2020 04:30:00 +0900</pubDate>
    </item>
    <item>
      <title>[JS] Prevent Stack Overflow</title>
      <link>https://interacting.tistory.com/158</link>
      <description>&lt;h3&gt;Exercise: Fix This Code&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;//fill array with 60000 elements
const list = new Array(60000).join('1.1').split('.');

function removeItemsFromList() {
    var item = list.pop();

    if (item) {
        removeItemsFromList();
    }
};

removeItemsFromList();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 recursive function 은 stack overflow 를 발생시킨다.&lt;/p&gt;
&lt;p&gt;recursive call around 는 유지하면서 stack overflow 를 피하려면 어떻게 고쳐야할까?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Solution Code&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const list = new Array(60000).join('1.1').split('.');

function removeItemsFromList() {
    var item = list.pop();

    if (item) {
      setTimeout(removeItemsFromList, 0);
    }
};

removeItemsFromList();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  &lt;/span&gt;문제 코드 실행 시, 크롬 브라우저에서 스택오버플로 발생&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;333&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clLwle/btqGkSAj57K/QFWY7fISgksxIBKNLfnU11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clLwle/btqGkSAj57K/QFWY7fISgksxIBKNLfnU11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clLwle/btqGkSAj57K/QFWY7fISgksxIBKNLfnU11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclLwle%2FbtqGkSAj57K%2FQFWY7fISgksxIBKNLfnU11%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;333&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  &lt;/span&gt;솔루션 코드 실행 시, 정상적으로 모든 작업 마침&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;373&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uU7m2/btqGebhCnm5/71IsZeoesnGEF7gVBg2HXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uU7m2/btqGebhCnm5/71IsZeoesnGEF7gVBg2HXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uU7m2/btqGebhCnm5/71IsZeoesnGEF7gVBg2HXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuU7m2%2FbtqGebhCnm5%2F71IsZeoesnGEF7gVBg2HXk%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;373&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;code&gt;setTimeout&lt;/code&gt; 에 &lt;span style=&quot;color: #333333;&quot;&gt;의해 과정이 끝난 뒤 콜백함수 실행했기때문!!!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;b&gt;솔루션_코드_실행되는_과정.gif&lt;/b&gt;&lt;/code&gt;&lt;b&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;566&quot; data-filename=&quot;preventstackoverflow.gif&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dd6vCn/btqGe9X0hmP/jVIDgkQXyoCN1QYBl9ZWQk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dd6vCn/btqGe9X0hmP/jVIDgkQXyoCN1QYBl9ZWQk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dd6vCn/btqGe9X0hmP/jVIDgkQXyoCN1QYBl9ZWQk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dd6vCn/btqGe9X0hmP/jVIDgkQXyoCN1QYBl9ZWQk/img.gif&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;566&quot; data-filename=&quot;preventstackoverflow.gif&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;(해당 이미지는 &lt;a href=&quot;http://latentflip.com/loupe&quot;&gt;http://latentflip.com/loupe&lt;/a&gt; 이용해서 만들었고,&lt;br /&gt;이해를 위해 setTimeout 의 delay 를 추가했습니다!)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;문제 출처 : &lt;span&gt;Udemy - JavaScript: The Advanced Concept&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;a href=&quot;https://www.udemy.com/course/advanced-javascript-concepts&quot;&gt;https://www.udemy.com/course/advanced-javascript-concepts&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>공부/JS</category>
      <category>js</category>
      <category>stackoverflow</category>
      <author>Carrot </author>
      <guid isPermaLink="true">https://interacting.tistory.com/158</guid>
      <comments>https://interacting.tistory.com/158#entry158comment</comments>
      <pubDate>Thu, 6 Aug 2020 05:53:59 +0900</pubDate>
    </item>
  </channel>
</rss>