I’m TUAN, currently a Full-stack Developer in Tokyo.
If you find this Blog interesting, please give me a like and subscribe to support me.
You can declare your Functions in many ways.
Use keyword function:
1 2 3 4 5 6 7 8 9 10 | <span class="token comment">// function declaration</span> <span class="token keyword">function</span> <span class="token function">test</span><span class="token punctuation">(</span><span class="token parameter">msg</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">Hey </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>msg<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> <span class="token comment">// function expression</span> <span class="token keyword">const</span> <span class="token function-variable function">test</span> <span class="token operator">=</span> <span class=" token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">msg</span><span class="token punctuation">)</span > <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">Hey </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>msg<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><span class="token punctuation">;</span> </span></span></span> |
You can call both declaration and expression functions as Normal/Regular Function
Arrow function was introduced in ES6 and is also known as arrow function.
1 2 3 4 | <span class="token keyword">const</span> <span class="token function- variable function">arrowFunction</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">msg</span ><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">Hey $ {msg}</span><span class="token template-punctuation string">`</span></span> <span class="token punctuation">}</span> </span> |
As you can see both function works the same in the above example. Now the question is why do we need regular funcion or arrow function.
Let’s discuss some issues below
1. Syntax – Syntax
2. Arguments binding – Argument binding
3. this
4. keyword: new
5. No duplicate named parameters
6. Function Hoisting
7. Method
———————————————–
1. Syntax – Syntax
We can write regular and arrow function this way
1 2 3 4 5 6 7 8 | <span class="token comment">// ES5</span> <span class="token keyword">var</span> <span class="token function-variable function">add</span> <span class="token operator">=</span> <span class=" token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">x<span class="token punctuation">,</span> y</ span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> x <span class="token operator">+</span> y<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment">// ES6</span> <span class="token keyword">let</span> <span class="token function-variable function">add</span> <span class="token operator">=</span> <span class=" token punctuation">(</span><span class="token parameter">x<span class="token punctuation">,</span> y</span><span class="token punctuation">)</ span> <span class="token operator">=></span> x <span class="token operator">+</span> y<span class="token punctuation">;</span> </span></span> |
Implicit Return – Default Return
In a regular function, you must use the return keyword to return any value . If you don’t return anything, the function returns undefined.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token keyword">function</span> <span class="token function">regFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token string">"Regular Function"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">regFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Regular Function</span> <span class="token keyword">function</span> <span class="token function">regFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"Regular Function"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">regFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Regular Function</span> <span class="token comment">// undefined</span> |
The arrow functions work the same way when returning a value.
If arrow function contains an expression, you can omit the curly braces and then the expression will be returned implicitly returned.
{}
optional if it has only one line statement
1 2 3 | <span class="token keyword">const</span> <span class="token function- variable function">addOne</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">number</span ><span class="token punctuation">)</span> <span class="token operator">=></span> number <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token function">addOne</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </span> |
()
optional if you have only one argument
let add = (x) => x + x;
If no argument
let arrowFunc = _ => console.log("Arrow Function");
2. Arguments binding – Binding Arguments
In a regular function, the arguments keywords can be used to access arguments passed to the function.
Example:
1 2 3 4 5 6 | <span class="token keyword">function</span> <span class="token function">regularFunction</span><span class="token punctuation">(</span><span class="token parameter">a<span class="token punctuation">,</span> b</span>< span class="token punctuation">) <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>arguments<span class="token">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">regularFunction</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Arguments[1,2]</span> |
The arrow functions have no argument binding.
1 2 3 4 5 6 | <span class="token keyword">const</span> <span class="token function- variable function">arrowFunction</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">a<span class="token punctuation">,</span> b</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>arguments<span class="token">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token function">arrowFunction</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//ReferenceError: arguments is not defined</span> |
However, if you want to access the arguments in a arrow function, you can use the rest:
operator
1 2 3 4 5 6 | <span class="token keyword">var</span> <span class="token function- variable function">arrowFunction</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter"><span class="token operator">...</span>args</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token operator">...</span>args<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token function">arrowFunction</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 1 2</span> |
3. this
In a regular function, this changes according to how the function is called.
- Simple Invocation:
this
with a global object or may be undefined if you are using mode strict mode. - Method Invocation:
this
with the object that owns the function. - Indirect Invocation:
this
with the first argument. - Constructor Invocation:
this
with the newly created instance.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <span class="token comment">// 1️⃣ Simple Invocation</span> <span class="token keyword">function</span> <span class="token function">simpleInvocation</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword ">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">simpleInvocation</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Window Object</span> <span class="token comment">// 2️⃣ Method Invocation</span> <span class="token keyword">const</span> methodInvocation <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token function">method</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword ">this</span><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><span class="token punctuation">;</span> methodInvocation<span class="token punctuation">.</span><span class="token function">method</span><span class="token punctuation">(</span><span class="token punctuation marks">)</span><span class="token punctuation">;</span> <span class="token comment">// logs methodInvocation object</span> <span class="token comment">// 3️⃣ Indirect Invocation</span> <span class="token keyword">const</span> context <span class="token operator">=</span> <span class="token punctuation">{</span> aVal<span class="token operator">:</span> <span class="token string">"A"</span><span class="token punctuation">,</span> bVal<span class="token operator">:< /span> <span class="token string">"B"</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">indirectInvocation</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword ">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">indirectInvocation</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// logs { aVal: 'A' }</span> <span class="token function">indirectInvocation</span><span class="token punctuation">.</span><span class="token function">apply</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// logs { bVal: 'A' }</span> <span class="token comment">// 4️⃣ Constructor Invocation</span> <span class="token keyword">function</span> <span class="token function">constructorInvocation</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword ">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">new</span> <span class="token class-name">constructorInvocation</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// logs an instance of constructorInvocation</span> </span> |
The arrow functions don’t have their own this and they don’t redefine the value of this inside the function .
this
inside a arrow function always refers to this from contexts inside outside.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token keyword">var</span> name <span class="token operator ">=</span> <span class="token string">"Suprabha"</span> <span class="token keyword">let</span> newObject <span class="token operator">=</span> <span class="token punctuation">{</span> name <span class="token operator">:</span> <span class="token string">"supi"</span><span class="token punctuation">,</span> <span class="token function-variable function">arrowFunc</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> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword ">this</span><span class="token punctuation">.</span>name<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">regularFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword ">this</span><span class="token punctuation">.</span>name<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> newObject<span class="token punctuation">.</span><span class="token function">arrowFunc</span><span class="token punctuation">(</span><span class="token punctuation marks">)</span><span class="token punctuation">;</span> <span class="token comment">// Suprabha</span> newObject<span class="token punctuation">.</span><span class="token function">regularFunc</span><span class="token punctuation">(</span><span class="token punctuation marks">)</span><span class="token punctuation">;</span> <span class="token comment">// supi</span> |
4. new
Common functions can use constructor, they can be called using the keyword new.
1 2 3 4 5 6 | <span class="token keyword">function</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token parameter">x<span class="token punctuation">,</span> y</span>< span class="token punctuation">) <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>x <span class="token">+</span> y<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">let</span> sum <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class">add</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span > <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 5</span> </span> |
However, arrow functions can never be used as constructors. Therefore, they can never be called with the new
. keyword
1 2 3 4 | <span class="token keyword">let</span> <span class="token function- variable function">add</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">x<span class="token punctuation">,</span> y</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>x <span class="token operator">+ </span> y<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> sum <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class">add</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span > <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// TypeError: add is not a constructor</span> </span> |
5. paramaters cannot have duplicate names
In normal function we can do this:
1 2 3 4 5 6 7 8 | <span class="token comment">// ✅ will work</span> <span class="token keyword">function</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token parameter">a<span class="token punctuation">,</span> a</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>< span class="token punctuation">} <span class="token comment">// will not work</span> <span class="token punctuation">(</span><span class="token string">"use strict"</span><span class="token punctuation">)</span><span class=" token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token parameter">a<span class="token punctuation">,</span> a</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>< span class="token punctuation">} <span class="token comment">// Uncaught SyntaxError: Duplicate parameter name not allowed in this context</span> |
arrow functions must never have duplicate named parameters, whether in strict mode or non-strict mode.
1 2 3 | <span class="token keyword">const</span> <span class="token function- variable function">arrowFunc</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">a<span class="token punctuation">,</span> a</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment">// Uncaught SyntaxError: Duplicate parameter name not allowed in this context</span> |
6. Function Hoisting
In normal function, function gets hoisting at the top.
1 2 3 4 5 6 | <span class="token function">normalFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">normalFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token string">"Normal Function"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// "Normal Function"</span> |
In arrow function, the function is hoisted where you declare it. So if you call the function before declaration you will get referenceError.
1 2 3 4 5 6 | <span class="token function">arrowFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token function-variable function">arrowFunc</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 keyword">return</span> <span class="token string">"Arrow Function"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment">// ReferenceError: Cannot access 'arrowFunc' before initializati</span> </span> |
7. Methods
You can define functions in a class using regular functions.
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">class</span> <span class="token class- name">FullName</span> <span class="token punctuation">{</span> <span class="token function">constructor</span><span class="token punctuation">(</span><span class="token parameter">name</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">result</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword ">this</span><span class="token punctuation">.</span>name<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">let</span> name <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class">FullName</span><span class="token punctuation">(</span><span class="token string">"Suprabha"</span><span class="token punctuation">)< /span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>name<span class="token">)</span><span class="token punctuation">;</span> <span class="token comment">// FullName {name: "Suprabha"}</span> </span> |
You also need to apply callback.
1 2 3 | <span class="token function">setTimeout</span><span class="token punctuation">(</span>name<span class="token punctuation">.</span>result<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">// after 1 second logs ""</span> |
But if you bind this
1 2 3 | <span class="token function">setTimeout</span><span class="token punctuation">(</span>name<span class="token punctuation">.</span><span class="token function">result</span><span class="token punctuation">.</span>< span class="token function">bind<span class="token punctuation">(</span>name<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> <span class="token comment">// Suprabha</span> |
By the example above, you can see that you must associate contexts this with their context.
In arrow function, you do not need to bind to context.
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">class</span> <span class="token class- name">FullName</span> <span class="token punctuation">{</span> <span class="token function">constructor</span><span class="token punctuation">(</span><span class="token parameter">name</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function-variable function">result</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> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword ">this</span><span class="token punctuation">.</span>name<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> <span class="token keyword">let</span> name <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FullName</span><span class="token punctuation">(</span><span class="token string">"Suprabha"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">setTimeout</span><span class="token punctuation">(</span>name<span class="token punctuation">.</span>result<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">// Suprabha</span> |
Khi nào không sử dụng arrow function
Object
1 2 3 4 5 6 7 | <span class="token keyword">let</span> dog <span class="token operator">=</span> <span class="token punctuation">{</span> count<span class="token operator">:</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token function-variable function">jumps</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 keyword">this</span><span class="token punctuation">.</span>count<span class="token operator">++</span><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> |
Khi bạn gọi dog.jumps
, số đếm không tăng lên. Đó là bởi vì this không bị ràng buộc với bất cứ điều gì, và sẽ kế thừa value của this từ phạm vi cha của nó.
Tham khảo
Tóm tắt
Trong hàm thông thường, this
value là động, Trong arrow function, this value bằng với value của hàm ngoài.
Trong hàm thông thường, các đối số sẽ cung cấp cho bạn danh sách tham số arguments được truyền vào hàm. argument của arrow function không được xác định.
Trong hàm thông thường, bạn luôn phải trả về bất kỳ value nào, nhưng trong arrow function, bạn có thể bỏ qua keyword return và có thể viết single line.
Trong mũi tên, các tham số của hàm phải là duy nhất.
Vấn đề Hoisting trong arrow function vì hàm không được gọi trước khi khởi tạo.
Như mọi khi, mình hy vọng bạn thích bài viết này và biết thêm được điều gì đó mới.
Cảm ơn và hẹn gặp lại các bạn trong những bài viết tiếp theo!
Nếu bạn thấy thích blog của mình thì nhấn theo dõi để ủng hộ mình nhé. Thank you.