{
    "componentChunkName": "component---src-templates-post-template-jsx",
    "path": "/ham-settimeout-trong-javascript/",
    "result": {"data":{"markdownRemark":{"html":"<p>Đôi khi bạn cần phải thực hiện hành động <strong>sau một khoảng thời gian</strong> nhất định. Để thực hiện điều này, bạn có thể sử dụng phương thức <code>setTimeout</code>. Sau đây là cách khai báo và sử dụng <strong>setTimeout trong JavaScript</strong>.</p>\n<h2 id=\"hàm-settimeout-trong-javascript\" style=\"position:relative;\"><a href=\"#h%C3%A0m-settimeout-trong-javascript\" aria-label=\"hàm settimeout trong javascript permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Hàm setTimeout trong JavaScript</h2>\n<p>Cú pháp hàm <code>setTimeout</code> là:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> timerId <span class=\"token operator\">=</span> <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>func<span class=\"token operator\">|</span>code<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>delay<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>arg1<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>arg2<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Trong đó:</p>\n<ul>\n<li><code>func|code</code>: là hàm hoặc string mô tả code để thực thi. Cách sử dụng thông thường là <strong>hàm</strong>. Cách sử dụng <strong>string</strong> được phép nhưng không khuyến khích.</li>\n<li><code>delay</code>: là <strong>thời gian trì hoãn</strong> trước khi hành động được thực hiện, tính theo <strong>mili giây</strong>. Giá trị mặc định của <code>delay</code> là <code>0</code>.</li>\n<li><code>arg1, arg2,...</code>: là danh sách các tham số truyền vào hàm.</li>\n</ul>\n<p>Ví dụ đoạn code sau gọi hàm <code>sayHi</code> sau 1 giây:</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">sayHi</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hello\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"gatsby-highlight-code-line\"><span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>sayHi<span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Hello</span></span></code></pre></div>\n<p>Ví dụ với tham số truyền vào hàm:</p>\n<div class=\"gatsby-highlight has-highlighted-lines\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">sayHi</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">message<span class=\"token punctuation\">,</span> who</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>message<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">, </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>who<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"gatsby-highlight-code-line\"><span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>sayHi<span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Hello\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Alex\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Hello, Alex</span></span></code></pre></div>\n<p>Nếu <strong>tham số đầu tiên là string</strong>, JavaScript engine sẽ <a href=\"/cu-phap-new-function-trong-javascript/\">tạo hàm từ string</a> đó để thực thi, ví dụ:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"console.log('Hello')\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Tuy nhiên, cách sử dụng <strong>string</strong> là không được khuyến khích, bạn có thể thay thế bằng <a href=\"/arrow-function-la-gi-arrow-function-trong-js/\"><strong>arrow function</strong></a> như sau:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hello\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><strong>Chú ý:</strong> Tham số đầu tiên là <strong>hàm</strong>, chứ <strong>không phải kết quả của việc gọi hàm</strong>, nhiều bạn hay bị nhầm lẫn như sau:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// gọi hàm sayHi() thay vì truyền vào hàm sayHi</span>\n<span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token function\">sayHi</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Khi gọi hàm <code>sayHi()</code> như trên, kết quả của hàm <code>sayHi()</code> được truyền vào hàm <code>setTimeout</code>. Mà hàm <code>setTimeout</code> chỉ chấp nhận truyền vào là function. Do đó, đoạn code trên sẽ không thực hiện gì sau 1 giây.</p>\n<h2 id=\"xóa-hành-động-với-cleartimeout\" style=\"position:relative;\"><a href=\"#x%C3%B3a-h%C3%A0nh-%C4%91%E1%BB%99ng-v%E1%BB%9Bi-cleartimeout\" aria-label=\"xóa hành động với cleartimeout permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Xóa hành động với clearTimeout</h2>\n<p>Khi bạn gọi hàm <strong>setTimeout trong JavaScript</strong>, kết quả trả về là một số nguyên <code>timerId</code> - định danh cho hành động với timeout. Để hủy bỏ hành động, bạn chỉ cần gọi <code>clearTimeout</code> như sau:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> timerId <span class=\"token operator\">=</span> <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token operator\">...</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">clearTimeout</span><span class=\"token punctuation\">(</span>timerId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Ví dụ bạn dự định gọi một hàm sau khoảng thời gian delay là 1 giây. Nhưng sau đó, bạn lại hủy bỏ hành động này:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> timerId <span class=\"token operator\">=</span> <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"sẽ không được gọi\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>timerId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// định danh cho timer</span>\n\n<span class=\"token function\">clearTimeout</span><span class=\"token punctuation\">(</span>timerId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>timerId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// timerId không đổi sau khi clearTimeout</span></code></pre></div>\n<h2 id=\"hàm-setinterval-trong-javascript\" style=\"position:relative;\"><a href=\"#h%C3%A0m-setinterval-trong-javascript\" aria-label=\"hàm setinterval trong javascript permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Hàm setInterval trong JavaScript</h2>\n<p>Hàm <code>setInterval</code> có cú pháp tương tự như hàm <code>setTimeout</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> timerId <span class=\"token operator\">=</span> <span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span>func<span class=\"token operator\">|</span>code<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>delay<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>arg1<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>arg2<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Trong đó, tất cả tham số đều có ý nghĩa giống với hàm <code>setTimeout</code>.</p>\n<p>Nhưng khác với hàm <code>setTimeout</code> là chỉ thực hiện hành động <strong>một lần</strong>, hàm <code>setInterval</code> sẽ gọi hàm thường xuyên sau <strong>mỗi khoảng thời gian delay</strong>.</p>\n<p>Để dừng hành động, bạn chỉ cần gọi hàm <code>clearInterval(timerId)</code>.</p>\n<p>Ví dụ sau hiển thị <code>\"Hello\"</code> sau mỗi 2 giây và sau đó 5 giây thì dừng lại:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// lặp lại với thời gian là 2000 ms (2 giây)</span>\n<span class=\"token keyword\">let</span> timerId <span class=\"token operator\">=</span> <span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hello\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// sau 5 giây thì dừng lại</span>\n<span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">clearInterval</span><span class=\"token punctuation\">(</span>timerId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"stop\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"hàm-settimeout-lồng-nhau\" style=\"position:relative;\"><a href=\"#h%C3%A0m-settimeout-l%E1%BB%93ng-nhau\" aria-label=\"hàm settimeout lồng nhau permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Hàm setTimeout lồng nhau</h2>\n<p>Ngoài cách sử dụng <code>setInterval</code> để thực hiện một hành động lặp đi lặp lại, bạn có thể sử dụng hàm <strong>setTimeout trong JavaScript</strong> theo cách lồng nhau như sau:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">/** thay vì:\nlet timerId = setInterval(() => console.log('Hello'), 2000);\n*/</span>\n\n<span class=\"token keyword\">let</span> timerId <span class=\"token operator\">=</span> <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token function\">sayHi</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hello\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  timerId <span class=\"token operator\">=</span> <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>sayHi<span class=\"token punctuation\">,</span> <span class=\"token number\">2000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// (*)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Trong ví dụ trên, cứ sau mỗi 2 giây thì hàm <code>sayHi</code> sẽ được gọi. Mà ở cuối hàm <code>sayHi</code> mình lại gọi tiếp <code>setTimeout</code> với hàm <code>sayHi</code> - tương tự cách gọi <a href=\"/ham-de-quy-trong-javascript/\">hàm đệ quy</a>.</p>\n<p>Cách gọi hàm <code>setTimeout</code> lồng nhau như trên giúp bạn xử lý <code>delay</code> linh hoạt hơn so với cách dùng <code>setInterval</code>. Vì bạn có thể tùy chỉnh thời gian <code>delay</code> cho mỗi lần lặp.</p>\n<p>Giả sử bạn cần tạo request lên server sau mỗi 5 giây để cập nhật dữ liệu. Tuy nhiên, server có thể bị quá tải. Dựa vào trạng thái server hiện tại, bạn có thể tăng thời gian delay lên 10, 20, 30, giây... cho phù hợp, ví dụ:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> delay <span class=\"token operator\">=</span> <span class=\"token number\">5000</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">let</span> timerId <span class=\"token operator\">=</span> <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token function\">request</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">/*... gửi request lên server...*/</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token comment\">/* mã lỗi trả về liên quan đến server quá tải */</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// tăng delay lên hai lần</span>\n    delay <span class=\"token operator\">*=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// chạy lại setTimeout với giá trị delay mới</span>\n  timerId <span class=\"token operator\">=</span> <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">,</span> delay<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> delay<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// -> giá trị delay ban đầu là 5000 ms</span></code></pre></div>\n<p>► <strong>Cách sử dụng <code>setTimeout</code> lồng nhau cho phép <code>delay</code> chính xác hơn giữa mỗi lần thực hiện hành động so với cách dùng <code>setInterval</code>.</strong></p>\n<p>Ví dụ dùng <code>setInterval</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">func</span><span class=\"token punctuation\">(</span>i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Ví dụ dùng <code>setTimeout</code> lồng nhau:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">func</span><span class=\"token punctuation\">(</span>i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>run<span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Hàm <code>setInterval</code> thực hiện hành động <code>func(i++)</code> sau mỗi 100ms. Tuy nhiên, hành động <code>func(i++)</code> cũng chiếm thời gian. Do đó, thời gian thực tế giữa hai lần chạy <code>func(i++)</code> là <strong>nhỏ hơn 100ms</strong>.</p>\n<p>Thậm chí là thời gian chạy <code>func(i++)</code> có thể nhiều hơn 100ms thì lần chạy <code>func(i++)</code> tiếp theo sẽ được gọi ngay lập tức sau lần gọi trước. Nói cách khác là <strong>không có thời gian delay</strong> giữa hai lần chạy <code>func(i++)</code>.</p>\n<p>Nhưng với cách sử dụng hàm <code>setTimeout</code> lồng nhau thì khác. Với cách này, hàm <code>setTimeout</code> tiếp theo chỉ được gọi khi hàm <code>func(i++)</code> thực hiện xong. Nghĩa là thời gian giữa hai lần chạy <code>func(i++)</code> sẽ <strong>đảm bảo khoảng 100ms</strong>.</p>\n<h2 id=\"vấn-đề-garbage-collection\" style=\"position:relative;\"><a href=\"#v%E1%BA%A5n-%C4%91%E1%BB%81-garbage-collection\" aria-label=\"vấn đề garbage collection permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vấn đề garbage collection</h2>\n<p>Như mình đã nói trong bài viết về <a href=\"/garbage-collection-trong-javascript/\">garbage collection trong JavaScript</a>, khi một giá trị là không thể tiếp cận thì nó sẽ được giải phóng khỏi bộ nhớ.</p>\n<p>Đối với hàm truyền vào <code>setTimeout/setInterval</code>, JavaScript engine sẽ tạo một tham chiếu nội bộ tới hàm thực thi để đảm bảo hàm này không bị giải phóng.</p>\n<p>Với hàm <code>setTimeout</code>, hàm truyền vào sẽ được giữ trong bộ nhớ cho tới khi hàm được gọi:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// hàm được giữ trong bộ nhớ cho tới khi thực thi xong</span>\n<span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Với hàm <code>setInterval</code>, hàm truyền vào được giải phóng khỏi bộ nhớ sau khi gọi <code>clearInterval</code>.</p>\n<p>Giả sử hàm truyền vào <code>setInterval</code> tham chiếu đến biến bên ngoài. Vì hàm này luôn tồn tại cho đến khi gọi <code>clearInterval</code>, nên biến được tham chiếu đến cũng sẽ <strong>không được giải phóng</strong>.</p>\n<blockquote>\n<p>Khi không thực sự cần thiết, hãy gọi hàm <code>clearInterval</code> để giải phóng bộ nhớ.</p>\n</blockquote>\n<h2 id=\"hàm-settimeout-với-thời-gian-delay-bằng-0\" style=\"position:relative;\"><a href=\"#h%C3%A0m-settimeout-v%E1%BB%9Bi-th%E1%BB%9Di-gian-delay-b%E1%BA%B1ng-0\" aria-label=\"hàm settimeout với thời gian delay bằng 0 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Hàm setTimeout với thời gian delay bằng 0</h2>\n<p>Có một trường hợp đặc biệt với hàm <code>setTimeout</code> là thời gian <code>delay</code> bằng 0.</p>\n<p>Theo lý thuyết, khi <code>delay = 0</code> thì hành động được thực hiện ngay lập tức. Nhưng thực tế, hành động sẽ được thực hiện ngay khi code luồng chính thực hiện xong, ví dụ:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"World\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hello\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// Hello</span>\n<span class=\"token comment\">// World</span></code></pre></div>\n<p>Trong ví dụ trên, câu lệnh <code>console.log(\"Hello\")</code> được thực hiện trước. Và ngay sau khi câu lệnh này thực hiện xong thì câu lệnh <code>console.log(\"World\")</code> được thực hiện.</p>\n<p><strong>Chú ý:</strong> thời gian delay trên trình duyệt không hoàn toàn bằng <code>0</code>.</p>\n<p>Đối với cách gọi hàm <code>setTimeout</code> lồng nhau, sau 5 lần gọi hàm, thời gian delay sẽ được set bằng 4ms, ví dụ:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> start <span class=\"token operator\">=</span> Date<span class=\"token punctuation\">.</span><span class=\"token function\">now</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">let</span> times <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// tính toán thời gian delay so với ban đầu</span>\n  times<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>Date<span class=\"token punctuation\">.</span><span class=\"token function\">now</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> start<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// sau 100ms tính từ thời điểm bắt đầu thì sẽ in ra log và dừng lại</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Date<span class=\"token punctuation\">.</span><span class=\"token function\">now</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> start <span class=\"token operator\">+</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>times<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>run<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// tiếp tục setTimeout</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// kết quả cuối cùng:</span>\n<span class=\"token comment\">// (22) [12,14,16,18,25,30,34,38,42,46,51,55,59,63,69,74,79,83,87,92,96,101]</span></code></pre></div>\n<p>Xem kết quả trên, bạn thấy rằng thời gian delay giữa mỗi lần gọi trong 5 lần đầu tiên là khoảng 2ms. Nhưng sau 5 lần thì thời gian delay tăng lên là khoảng 4ms.</p>\n<p>Đây chính là giới hạn của hàm <code>setTimeout</code> trên trình duyệt. Và giới hạn này cũng gặp phải khi sử dụng hàm <code>setInterval</code>.</p>\n<p>Ở môi trường khác như phía server, giới hạn này không gặp phải vì trên Node.js có hàm <a href=\"https://nodejs.org/api/timers.html#timers_setimmediate_callback_args\">setImmediate</a>.</p>\n<h2 id=\"tổng-kết-settimeout-trong-javascript\" style=\"position:relative;\"><a href=\"#t%E1%BB%95ng-k%E1%BA%BFt-settimeout-trong-javascript\" aria-label=\"tổng kết settimeout trong javascript permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Tổng kết setTimeout trong JavaScript</h2>\n<p>Hàm <code>setTimeout(func, delay, ...args)</code> trong JavaScript cho phép thực hiện hàm <code>func</code> <strong>một lần</strong> sau một khoảng thời gian <code>delay</code> với các tham số truyền vào là <code>args</code>.</p>\n<p>Hàm <code>setInterval(func, delay, ...args)</code> cũng tương tự như hàm <code>setTimeout</code>, nhưng hàm <code>func</code> được thực hiện sau <strong>mỗi lần</strong> <code>delay</code>.</p>\n<p>Để hủy bỏ không gọi hàm <code>func</code> nữa, bạn có thể gọi hàm <code>clearTimeout(timerId)</code> hoặc <code>clearInterval(timerId)</code> với <code>timerId</code> là kết quả trả về sau khi gọi hàm <code>setTimeout</code> hoặc <code>setInterval</code>.</p>\n<p>Việc gọi hàm <code>setTimeout</code> lồng nhau giúp bạn xử lý linh hoạt giá trị <code>delay</code> hơn so với cách sử dụng <code>setInterval</code>.</p>\n<p>Trường hợp gọi hàm <code>setTimeout(func, 0)</code> với giá trị <code>delay = 0</code>, tương đương với <code>setTimeout(func)</code> sẽ thực hiện hàm <code>func</code> ngay sau khi luồng code chính thực hiện xong.</p>\n<p>Đối với trình duyệt, sau 5 lần gọi hàm <code>setTimeout(func)</code> lồng nhau hoặc với <code>setInterval(func)</code> thì thời gian delay được set khoảng <strong>4ms</strong>.</p>\n<h2 id=\"thực-hành\" style=\"position:relative;\"><a href=\"#th%E1%BB%B1c-h%C3%A0nh\" aria-label=\"thực hành permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Thực hành</h2>\n<h3 id=\"bài-1\" style=\"position:relative;\"><a href=\"#b%C3%A0i-1\" aria-label=\"bài 1 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Bài 1</h3>\n<p>Viết hàm <code>printNumbers(start, end)</code> để in ra một số từ <code>start</code> đến <code>end</code> sau mỗi 1 giây theo hai cách:</p>\n<ol>\n<li>Sử dụng <code>setInterval</code>.</li>\n<li>Sử dụng <code>setTimeout</code>.</li>\n</ol>\n<div class=\"wrap-collapsible margin-bottom\">\n  <input id=\"collapsible1\" class=\"toggle\" type=\"checkbox\">\n  <label for=\"collapsible1\" class=\"lbl-toggle\">Xem đáp án</label>\n  <div class=\"collapsible-content\">\n    <div class=\"content-inner\">\n<p>► <strong>Cách 1: sử dụng <code>setInterval</code></strong></p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">printNumbers</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">start<span class=\"token punctuation\">,</span> end</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> timerId <span class=\"token operator\">=</span> <span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>start <span class=\"token operator\">></span> end<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">clearInterval</span><span class=\"token punctuation\">(</span>timerId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>start<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">printNumbers</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// 1, 2, 3, 4, 5</span></code></pre></div>\n<p>► <strong>Cách 2: sử dụng <code>setTimeout</code></strong></p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">printNumbers</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">start<span class=\"token punctuation\">,</span> end</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>start <span class=\"token operator\">></span> end<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>start<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>run<span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">printNumbers</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// 1, 2, 3, 4, 5</span></code></pre></div>\n</div>\n  </div>\n</div>\n<h3 id=\"bài-2\" style=\"position:relative;\"><a href=\"#b%C3%A0i-2\" aria-label=\"bài 2 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Bài 2</h3>\n<p>Trong đoạn code sau, hàm <code>setTimeout</code> được gọi với thời gian delay là 100ms.</p>\n<p>Sau đó là một <a href=\"/vong-lap-trong-javascript/\">vòng lặp <code>for</code></a> với số lần lặp khoảng 100000000 lần. Mà thời gian thực hiện vòng lặp lớn này thường hơn 100ms.</p>\n<p>Hỏi hàm với <code>setTimeout</code> được gọi khi nào?</p>\n<ol>\n<li>Sau vòng lặp.</li>\n<li>Trước vòng lặp.</li>\n<li>Trong khi vòng lặp đang chạy.</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// ?</span>\n\n<span class=\"token comment\">// giả sử thời gian thực hiện vòng lặp lớn hơn 100ms</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"trước vòng lặp\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">&lt;</span> <span class=\"token number\">100000000</span><span class=\"token punctuation\">;</span> j<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  i<span class=\"token operator\">++</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"sau vòng lặp\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<div class=\"wrap-collapsible margin-bottom\">\n  <input id=\"collapsible2\" class=\"toggle\" type=\"checkbox\">\n  <label for=\"collapsible2\" class=\"lbl-toggle\">Xem đáp án</label>\n  <div class=\"collapsible-content\">\n    <div class=\"content-inner\">\n<p>Kết quả là:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">trước vòng lặp\nsau vòng lặp\n100000000</code></pre></div>\n<p>Nghĩa là hàm với <code>setTimeout</code> được gọi ngay sau vòng lặp.</p>\n</div>\n  </div>\n</div>\n<p>Tham khảo:</p>\n<ul>\n<li><a href=\"https://javascript.info/settimeout-setinterval\">Scheduling: setTimeout and setInterval</a></li>\n<li><a href=\"https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers\">Timers</a></li>\n</ul>","timeToRead":10,"excerpt":"Đôi khi bạn cần phải thực hiện hành động sau một khoảng thời gian nhất định. Để thực hiện điều này, bạn có thể sử dụng phương thức…","frontmatter":{"directory":"JavaScript","title":"Hàm setTimeout trong JavaScript","date":"2017-06-19T06:20:00Z","tags":["Hàm"],"description":"Để thực hiện hành động sau một khoảng thời gian nhất định, bạn có thể sử dụng phương thức setTimeout. Sau đây là cách khai báo và sử dụng setTimeout trong JavaScript.","keywords":"setTimeout trong javascript","cover":{"childImageSharp":{"gatsbyImageData":{"layout":"fixed","backgroundColor":"#283838","images":{"fallback":{"src":"/static/108ab4f763fc851f2f9f529c413bb9fc/bc51f/ham-settimeout-trong-javascript.png","srcSet":"/static/108ab4f763fc851f2f9f529c413bb9fc/bc51f/ham-settimeout-trong-javascript.png 660w","sizes":"660px"},"sources":[{"srcSet":"/static/108ab4f763fc851f2f9f529c413bb9fc/2b2b5/ham-settimeout-trong-javascript.webp 660w","type":"image/webp","sizes":"660px"}]},"width":660,"height":400}}},"update":"2021-12-29T21:30:00Z"},"fields":{"slug":"/ham-settimeout-trong-javascript/","date":"2017-06-19T06:20:00.000Z"}},"sameSeries":{"totalCount":10,"edges":[{"node":{"fields":{"slug":"/ham-de-quy-trong-javascript/","date":"2017-06-12T20:30:00.000Z"},"excerpt":"Hàm đệ quy trong JavaScript chính là một hàm tự gọi lại chính nó. Ví dụ sau in ra Hello world! n lần sử dụng hàm đệ quy: Kết quả: Đây chỉ là…","timeToRead":9,"frontmatter":{"title":"Hàm đệ quy trong JavaScript","shortTitle":null,"tags":["Hàm"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/c816b29939558d0d7cf4f3124704475b/bc51f/ham-de-quy-trong-javascript.png","srcSet":"/static/c816b29939558d0d7cf4f3124704475b/41200/ham-de-quy-trong-javascript.png 165w,\n/static/c816b29939558d0d7cf4f3124704475b/f979a/ham-de-quy-trong-javascript.png 330w,\n/static/c816b29939558d0d7cf4f3124704475b/bc51f/ham-de-quy-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/c816b29939558d0d7cf4f3124704475b/322ad/ham-de-quy-trong-javascript.webp 165w,\n/static/c816b29939558d0d7cf4f3124704475b/de3b3/ham-de-quy-trong-javascript.webp 330w,\n/static/c816b29939558d0d7cf4f3124704475b/2b2b5/ham-de-quy-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-12T20:30:00Z","update":"2021-12-22T20:30:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/dau-ba-cham-trong-javascript/","date":"2017-06-13T20:30:00.000Z"},"excerpt":"Rất nhiều hàm trong JavaScript hỗ trợ truyền vào số lượng tham số không giới hạn, ví dụ: Math.max(arg1, arg2, ..., argN): trả về giá trị lớn…","timeToRead":10,"frontmatter":{"title":"Dấu ba chấm trong JavaScript","shortTitle":null,"tags":["Hàm"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/af7085ca0b293e63fcccdea23ef5bb47/bc51f/dau-ba-cham-trong-javascript.png","srcSet":"/static/af7085ca0b293e63fcccdea23ef5bb47/41200/dau-ba-cham-trong-javascript.png 165w,\n/static/af7085ca0b293e63fcccdea23ef5bb47/f979a/dau-ba-cham-trong-javascript.png 330w,\n/static/af7085ca0b293e63fcccdea23ef5bb47/bc51f/dau-ba-cham-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/af7085ca0b293e63fcccdea23ef5bb47/322ad/dau-ba-cham-trong-javascript.webp 165w,\n/static/af7085ca0b293e63fcccdea23ef5bb47/de3b3/dau-ba-cham-trong-javascript.webp 330w,\n/static/af7085ca0b293e63fcccdea23ef5bb47/2b2b5/dau-ba-cham-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-13T20:30:00Z","update":"2021-12-23T07:15:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/tim-hieu-javascript-closures/","date":"2017-06-14T06:35:17.000Z"},"excerpt":"Closure trong JS là một trong những khái niệm quan trọng. Việc nắm chắc JavaScript closure là gì và cách sử dụng closure trong JavaScript…","timeToRead":9,"frontmatter":{"title":"Closure là gì? Tìm hiểu closure trong JS","shortTitle":null,"tags":["Hàm"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/9b2f7c91c5fbcdf69e1e1a33952e7418/bc51f/tim-hieu-javascript-closures.png","srcSet":"/static/9b2f7c91c5fbcdf69e1e1a33952e7418/41200/tim-hieu-javascript-closures.png 165w,\n/static/9b2f7c91c5fbcdf69e1e1a33952e7418/f979a/tim-hieu-javascript-closures.png 330w,\n/static/9b2f7c91c5fbcdf69e1e1a33952e7418/bc51f/tim-hieu-javascript-closures.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/9b2f7c91c5fbcdf69e1e1a33952e7418/322ad/tim-hieu-javascript-closures.webp 165w,\n/static/9b2f7c91c5fbcdf69e1e1a33952e7418/de3b3/tim-hieu-javascript-closures.webp 330w,\n/static/9b2f7c91c5fbcdf69e1e1a33952e7418/2b2b5/tim-hieu-javascript-closures.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-14T06:35:17Z","update":"2021-12-25T07:00:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/var-trong-javascript-va-cach-su-dung-iife/","date":"2017-06-15T06:20:00.000Z"},"excerpt":"Var trong JavaScript là một cách cũ để khai báo biến. Và bạn không nên sử dụng var nữa, mà thay vào đó là sử dụng let hoặc const. Tuy nhiên…","timeToRead":6,"frontmatter":{"title":"Var trong JavaScript và cách sử dụng IIFE","shortTitle":"Var trong JavaScript và sử dụng IIFE","tags":["Hàm","Biến"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/191efc837cd96aa4891ae1eb3975bfc4/bc51f/var-trong-javascript-va-cach-su-dung-iife.png","srcSet":"/static/191efc837cd96aa4891ae1eb3975bfc4/41200/var-trong-javascript-va-cach-su-dung-iife.png 165w,\n/static/191efc837cd96aa4891ae1eb3975bfc4/f979a/var-trong-javascript-va-cach-su-dung-iife.png 330w,\n/static/191efc837cd96aa4891ae1eb3975bfc4/bc51f/var-trong-javascript-va-cach-su-dung-iife.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/191efc837cd96aa4891ae1eb3975bfc4/322ad/var-trong-javascript-va-cach-su-dung-iife.webp 165w,\n/static/191efc837cd96aa4891ae1eb3975bfc4/de3b3/var-trong-javascript-va-cach-su-dung-iife.webp 330w,\n/static/191efc837cd96aa4891ae1eb3975bfc4/2b2b5/var-trong-javascript-va-cach-su-dung-iife.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-15T06:20:00Z","update":"2021-12-27T20:00:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/doi-tuong-global-trong-javascript/","date":"2017-06-16T06:20:00.000Z"},"excerpt":"Bài viết này giúp bạn tìm hiểu về đối tượng global trong JavaScript. Qua đây, bạn biết khi nào nên sử dụng đối tượng global. Đối tượng…","timeToRead":4,"frontmatter":{"title":"Đối tượng global trong JavaScript","shortTitle":null,"tags":["Hàm","Object"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/1c2321a3e8f980abcde1bfc0e4ade5f6/bc51f/doi-tuong-global-trong-javascript.png","srcSet":"/static/1c2321a3e8f980abcde1bfc0e4ade5f6/41200/doi-tuong-global-trong-javascript.png 165w,\n/static/1c2321a3e8f980abcde1bfc0e4ade5f6/f979a/doi-tuong-global-trong-javascript.png 330w,\n/static/1c2321a3e8f980abcde1bfc0e4ade5f6/bc51f/doi-tuong-global-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/1c2321a3e8f980abcde1bfc0e4ade5f6/322ad/doi-tuong-global-trong-javascript.webp 165w,\n/static/1c2321a3e8f980abcde1bfc0e4ade5f6/de3b3/doi-tuong-global-trong-javascript.webp 330w,\n/static/1c2321a3e8f980abcde1bfc0e4ade5f6/2b2b5/doi-tuong-global-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-16T06:20:00Z","update":"2021-12-27T21:15:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/function-object-trong-javascript/","date":"2017-06-17T06:20:00.000Z"},"excerpt":"Function trong JavaScript cũng là một loại object. Vì vậy, bạn có thể thêm/xóa thuộc tính vào function hoặc truyền qua hàm khác bởi tham…","timeToRead":9,"frontmatter":{"title":"Function object trong JavaScript","shortTitle":null,"tags":["Hàm","Object"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/400488f0f0a74e1e67ccbbdc6c5c33f0/bc51f/function-object-trong-javascript.png","srcSet":"/static/400488f0f0a74e1e67ccbbdc6c5c33f0/41200/function-object-trong-javascript.png 165w,\n/static/400488f0f0a74e1e67ccbbdc6c5c33f0/f979a/function-object-trong-javascript.png 330w,\n/static/400488f0f0a74e1e67ccbbdc6c5c33f0/bc51f/function-object-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/400488f0f0a74e1e67ccbbdc6c5c33f0/322ad/function-object-trong-javascript.webp 165w,\n/static/400488f0f0a74e1e67ccbbdc6c5c33f0/de3b3/function-object-trong-javascript.webp 330w,\n/static/400488f0f0a74e1e67ccbbdc6c5c33f0/2b2b5/function-object-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-17T06:20:00Z","update":"2021-12-28T20:00:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/cu-phap-new-function-trong-javascript/","date":"2017-06-18T06:20:00.000Z"},"excerpt":"Cú pháp new Function trong JavaScript là một cách khác để định nghĩa hàm. Cách này ít khi được sử dụng, nhưng đôi khi lại rất hữu ích. Cú…","timeToRead":4,"frontmatter":{"title":"Cú pháp new Function trong JavaScript","shortTitle":null,"tags":["Hàm"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/b6d65cda6609acf9edf70a006747b3d8/bc51f/cu-phap-new-function-trong-javascript.png","srcSet":"/static/b6d65cda6609acf9edf70a006747b3d8/41200/cu-phap-new-function-trong-javascript.png 165w,\n/static/b6d65cda6609acf9edf70a006747b3d8/f979a/cu-phap-new-function-trong-javascript.png 330w,\n/static/b6d65cda6609acf9edf70a006747b3d8/bc51f/cu-phap-new-function-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/b6d65cda6609acf9edf70a006747b3d8/322ad/cu-phap-new-function-trong-javascript.webp 165w,\n/static/b6d65cda6609acf9edf70a006747b3d8/de3b3/cu-phap-new-function-trong-javascript.webp 330w,\n/static/b6d65cda6609acf9edf70a006747b3d8/2b2b5/cu-phap-new-function-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-18T06:20:00Z","update":"2021-12-29T20:00:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/ham-settimeout-trong-javascript/","date":"2017-06-19T06:20:00.000Z"},"excerpt":"Đôi khi bạn cần phải thực hiện hành động sau một khoảng thời gian nhất định. Để thực hiện điều này, bạn có thể sử dụng phương thức…","timeToRead":10,"frontmatter":{"title":"Hàm setTimeout trong JavaScript","shortTitle":null,"tags":["Hàm"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/108ab4f763fc851f2f9f529c413bb9fc/bc51f/ham-settimeout-trong-javascript.png","srcSet":"/static/108ab4f763fc851f2f9f529c413bb9fc/41200/ham-settimeout-trong-javascript.png 165w,\n/static/108ab4f763fc851f2f9f529c413bb9fc/f979a/ham-settimeout-trong-javascript.png 330w,\n/static/108ab4f763fc851f2f9f529c413bb9fc/bc51f/ham-settimeout-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/108ab4f763fc851f2f9f529c413bb9fc/322ad/ham-settimeout-trong-javascript.webp 165w,\n/static/108ab4f763fc851f2f9f529c413bb9fc/de3b3/ham-settimeout-trong-javascript.webp 330w,\n/static/108ab4f763fc851f2f9f529c413bb9fc/2b2b5/ham-settimeout-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-19T06:20:00Z","update":"2021-12-29T21:30:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/decorator-forwarding-ham-trong-javascript/","date":"2017-06-20T06:20:00.000Z"},"excerpt":"JavaScript giúp bạn xử lý hàm rất linh động. Bạn có thể truyền hàm vào hàm khác qua tham số hoặc sử dụng hàm như object. Và sau đây, mình sẽ…","timeToRead":12,"frontmatter":{"title":"Kỹ thuật decorator, forwarding của hàm trong JavaScript","shortTitle":"Decorator, forwarding của hàm trong JS","tags":["Hàm"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/83596cfd0923fbf2c11629e3f3b70183/bc51f/decorator-forwarding-ham-trong-javascript.png","srcSet":"/static/83596cfd0923fbf2c11629e3f3b70183/41200/decorator-forwarding-ham-trong-javascript.png 165w,\n/static/83596cfd0923fbf2c11629e3f3b70183/f979a/decorator-forwarding-ham-trong-javascript.png 330w,\n/static/83596cfd0923fbf2c11629e3f3b70183/bc51f/decorator-forwarding-ham-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/83596cfd0923fbf2c11629e3f3b70183/322ad/decorator-forwarding-ham-trong-javascript.webp 165w,\n/static/83596cfd0923fbf2c11629e3f3b70183/de3b3/decorator-forwarding-ham-trong-javascript.webp 330w,\n/static/83596cfd0923fbf2c11629e3f3b70183/2b2b5/decorator-forwarding-ham-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-20T06:20:00Z","update":"2022-01-02T08:30:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}},{"node":{"fields":{"slug":"/function-binding-trong-javascript/","date":"2017-06-21T06:20:00.000Z"},"excerpt":"Khi sử dụng phương thức của object làm hàm callback, ví dụ sử dụng với hàm setTimeout, thường xảy ra vấn đề là: \"mất giá trị this\". Sau đây…","timeToRead":8,"frontmatter":{"title":"Function binding trong JavaScript","shortTitle":null,"tags":["Hàm"],"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","backgroundColor":"#283838","images":{"fallback":{"src":"/static/d71e212eaf1b1d572add09899f83a21d/bc51f/function-binding-trong-javascript.png","srcSet":"/static/d71e212eaf1b1d572add09899f83a21d/41200/function-binding-trong-javascript.png 165w,\n/static/d71e212eaf1b1d572add09899f83a21d/f979a/function-binding-trong-javascript.png 330w,\n/static/d71e212eaf1b1d572add09899f83a21d/bc51f/function-binding-trong-javascript.png 660w","sizes":"(min-width: 660px) 660px, 100vw"},"sources":[{"srcSet":"/static/d71e212eaf1b1d572add09899f83a21d/322ad/function-binding-trong-javascript.webp 165w,\n/static/d71e212eaf1b1d572add09899f83a21d/de3b3/function-binding-trong-javascript.webp 330w,\n/static/d71e212eaf1b1d572add09899f83a21d/2b2b5/function-binding-trong-javascript.webp 660w","type":"image/webp","sizes":"(min-width: 660px) 660px, 100vw"}]},"width":660,"height":400}}},"date":"2017-06-21T06:20:00Z","update":"2022-01-02T14:30:00Z","series":"JavaScript: Kiến thức nâng cao về hàm"}}}]}},"pageContext":{"slug":"/ham-settimeout-trong-javascript/","series":"JavaScript: Kiến thức nâng cao về hàm","nextTitle":"Cú pháp new Function trong JavaScript","nextSlug":"/cu-phap-new-function-trong-javascript/","prevTitle":"Kỹ thuật decorator, forwarding của hàm trong JavaScript","prevSlug":"/decorator-forwarding-ham-trong-javascript/","latestEdges":[{"node":{"fields":{"slug":"/cach-chon-cms-cho-trang-web/"},"frontmatter":{"directory":"Bài viết được tài trợ","template":"post","title":"Làm thế nào để chọn CMS phù hợp cho trang web của bạn?","shortTitle":"Cách chọn CMS cho trang web","tags":["Wordpress","CMS"],"date":"2022-06-27T20:30:00Z","update":"2022-06-27T20:30:00Z"}}},{"node":{"fields":{"slug":"/async-await-la-gi-async-await-trong-javascript/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Async/await là gì? Async/await trong JavaScript","shortTitle":"Async/await là gì? Async/await trong JS","tags":["Async - Await","Promise"],"date":"2017-07-16T06:00:00Z","update":"2022-05-11T21:45:00Z"}}},{"node":{"fields":{"slug":"/microtasks-la-gi-microtasks-trong-javascript/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Microtasks là gì? Microtasks trong JavaScript","shortTitle":"Microtasks là gì? Microtasks trong JS","tags":["Callback","Promise"],"date":"2017-07-15T06:00:00Z","update":"2022-05-11T21:00:00Z"}}},{"node":{"fields":{"slug":"/chuyen-callback-thanh-promise-trong-javascript/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Chuyển callback thành promise trong JavaScript","shortTitle":"Chuyển callback thành promise trong JS","tags":["Callback","Promise"],"date":"2017-07-14T06:00:00Z","update":"2022-05-11T20:00:00Z"}}},{"node":{"fields":{"slug":"/promise-api-trong-javascript/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Các promise API trong JavaScript","shortTitle":null,"tags":["Promise"],"date":"2017-07-13T06:00:00Z","update":"2022-05-08T21:00:00Z"}}},{"node":{"fields":{"slug":"/xu-ly-loi-voi-promise-trong-javascript/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Xử lý lỗi với promise trong JavaScript","shortTitle":null,"tags":["Promise"],"date":"2017-07-12T06:00:26Z","update":"2022-05-08T20:00:00Z"}}},{"node":{"fields":{"slug":"/chuoi-promise-trong-javascript/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Chuỗi promise trong JavaScript","shortTitle":null,"tags":["Promise"],"date":"2017-07-10T16:24:00Z","update":"2022-05-08T16:24:00Z"}}},{"node":{"fields":{"slug":"/promise-la-gi-promise-trong-javascript/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Promise là gì? Promise trong JavaScript","shortTitle":null,"tags":["Promise"],"date":"2017-07-09T13:45:00Z","update":"2022-05-08T13:45:48Z"}}},{"node":{"fields":{"slug":"/callback-la-gi-callback-trong-javascript/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Callback là gì? Callback trong JavaScript","shortTitle":null,"tags":["Callback","Hàm"],"date":"2017-07-08T10:40:00Z","update":"2022-05-08T10:40:48Z"}}},{"node":{"fields":{"slug":"/tuy-bien-mo-rong-doi-tuong-error/"},"frontmatter":{"directory":"JavaScript","template":"post","title":"Tùy biến và mở rộng đối tượng Error trong JavaScript","shortTitle":"Tùy biến và mở rộng đối tượng Error trong JS","tags":["Error"],"date":"2017-07-06T08:00:00Z","update":"2022-05-08T08:24:00Z"}}}],"latestEdgesTitle":"Bài viết mới cập nhật"}},
    "staticQueryHashes": []}