{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/function-declaration-vs-function-expression-in-js","result":{"data":{"markdownRemark":{"id":"19973511-1813-5c25-9893-c6711758cf60","html":"<p>Post này chỉ là 1 <strong>note</strong> nhỏ của mình cho những <strong>dev</strong> hay quên về 2 khái niệm <strong>function declaration</strong> và <strong>function expression</strong> để mỗi lần nhắc đến chỉ việc vào đây xem lại chứ không cần phải <strong>google</strong> nữa 😅😅</p>\n<p><img src=\"/media/take-note.gif\" alt=\"Take note\"></p>\n<p>Chắc hẳn anh em ngày ngày làm việc với <strong>javascript</strong> sẽ viết rất nhiều <strong>function</strong> với các cú pháp như:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">doSomething</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span> <span class=\"token comment\">// function declaration</span>\n\n<span class=\"token comment\">// hoặc</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">doSomething</span> <span class=\"token operator\">=</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 punctuation\">}</span> <span class=\"token comment\">// function expression</span>\n\n<span class=\"token comment\">// hoặc</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">doSomething</span> <span class=\"token operator\">=</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 comment\">// function expression</span></code></pre></div>\n<p>Cách viết đầu tiên chính là <strong>function declaration</strong>, và 2 cách sau là <strong>function expression</strong>, vậy chúng khác gì nhau và sử dụng như thế nào?</p>\n<h2 id=\"definition\" style=\"position:relative;\"><a href=\"#definition\" aria-label=\"definition 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>Definition</h2>\n<p>Khác biết đầu tiên chính là cách định nghĩa <strong>function</strong></p>\n<ul>\n<li><strong>Function declaraion</strong> được khai báo với từ khóa <code class=\"language-text\">function</code> và <strong>luôn</strong> bao gồm tên của <strong>function</strong> đó</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">doSomething</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li><strong>Function expression</strong> được khai báo tương tự như <strong>function declaraion</strong> nhưng được gán vào 1 <strong>biến</strong> và sẽ chạy khi được gọi qua <strong>biến</strong> đó, tên của <strong>function</strong> có thể bỏ đi (<strong>anonymous function</strong>)</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">doSomething</span> <span class=\"token operator\">=</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 punctuation\">}</span>\n\n<span class=\"token comment\">// Anonymous function in ES6 syntax</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">doSomething</span> <span class=\"token operator\">=</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></code></pre></div>\n<h2 id=\"hoisting\" style=\"position:relative;\"><a href=\"#hoisting\" aria-label=\"hoisting 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>Hoisting</h2>\n<p><strong>Hoisting</strong> là 1 cơ chế của <strong>Javascript</strong> thể hiện việc đưa <strong>function</strong> và <strong>variable</strong> lên trên cùng của <strong>scope</strong> trước khi <strong>code</strong> được thực thi.</p>\n<blockquote>\n<p><strong>Hoisting</strong> chỉ áp dụng <strong>function declarations</strong>, không áp dụng cho <strong>function expressions</strong></p>\n</blockquote>\n<p>Có thế hiểu đơn giản qua ví dụ sau:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">sayHello</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => \"Hello\"</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">sayHello</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>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Bạn có thể <strong>call</strong> <strong>function declaration</strong> ở bất cứ đâu trong <strong>scope</strong> nó khởi tạo</p>\n<p>Tuy nhiên <strong>function expression</strong> chỉ có thể gọi sau khi định nghĩa</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">sayHello</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => Uncaught ReferenceError: Cannot access 'sayHello' before initialization</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">sayHello</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</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>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Tùy theo thói quen của <strong>dev</strong> và <strong>rule</strong> của <strong>project</strong> hoặc <strong>team leader</strong> đặt ra mà có thể sử dụng 1 trong 2 cách <strong>define function</strong> này.</p>\n<p>Tuy nhiên có 1 số trường hợp đặc biệt để sử dụng <strong>function expression</strong></p>\n<h2 id=\"iife\" style=\"position:relative;\"><a href=\"#iife\" aria-label=\"iife 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>IIFE</h2>\n<p><a href=\"https://mariusschulz.com/blog/use-cases-for-javascripts-iifes\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Immediately Invoked Function Expressions</a> hay 1 <strong>anonymous function</strong> được chạy ngay sau khi khởi tạo</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><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    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Code runs!'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// ES6</span>\n<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    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Code runs!'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"callback\" style=\"position:relative;\"><a href=\"#callback\" aria-label=\"callback 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>Callback</h2>\n<p>1 trường hợp sử dụng <strong>function expression</strong> nữa đó là dùng làm <strong>callback</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">buttonElement<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">'click'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</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\">'button is clicked!'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>hoặc</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">item</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// do stuff to an item</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Đây là trường hợp phổ biến sử dụng <strong>function expression</strong> vì chúng ta không cần biết đến <strong>function</strong> này trong toàn bộ scope</p>\n<p>Tóm lại, có thể sử dụng linh hoạt 2 cách <strong>define function</strong> trên, nếu muốn 1 <strong>function</strong> có thể sử dụng linh hoạt nhiều nơi trong <strong>scope</strong> thì sử dụng <strong>function declaration</strong> còn nếu chỉ cần giới hạn trong 1 thời điểm sử dụng thì dùng <strong>function expression</strong></p>\n<h2 id=\"tham-khảo\" style=\"position:relative;\"><a href=\"#tham-kh%E1%BA%A3o\" aria-label=\"tham khảo 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>Tham khảo</h2>\n<ul>\n<li><a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Function declaration</a></li>\n<li><a href=\"https://developer.mozilla.org/en-US/docs/web/JavaScript/Reference/Operators/function\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Function expression</a></li>\n<li><a href=\"https://www.freecodecamp.org/news/when-to-use-a-function-declarations-vs-a-function-expression-70f15152a0a0/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://www.freecodecamp.org/news/when-to-use-a-function-declarations-vs-a-function-expression-70f15152a0a0/</a></li>\n<li><a href=\"https://gomakethings.com/function-expressions-vs-function-declarations/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://gomakethings.com/function-expressions-vs-function-declarations/</a></li>\n</ul>","fields":{"slug":"/posts/function-declaration-vs-function-expression-in-js","tagSlugs":["/tag/javascript/","/tag/function/","/tag/function-declaration/","/tag/function-expression/","/tag/anonymous-function/","/tag/arrow-function/","/tag/es-5/","/tag/es-6/"]},"frontmatter":{"date":"2020-09-16T22:12:03.284Z","description":"Phân biệt 2 khái niệm cơ bản trong Javascript - Function Declaration vs Function Expression và các trường hợp sử dụng","tags":["javascript","function","function-declaration","function-expression","anonymous-function","arrow-function","es5","es6"],"title":"Javascript - function declaration vs function expression","socialImage":"/media/singapore.jpg","headerImage":"/media/singapore.jpg"},"timeToRead":3}},"pageContext":{"slug":"/posts/function-declaration-vs-function-expression-in-js"}}}