a

19:05:44 29/3/2025 - 3 views -
Javascript

Hàm trong Javascript | Function in JS

​​Lần sửa đổi gần nhất : 18/3/2025

Góp ý bài viết : Nếu thông tin sai lệch hoặc không hữu ích hãy thông báo cho tác giả , xin cảm ơn

Zalo : 0961628548

→ Gmail : [email protected]


​Hàm là thành phần cơ bản trong mọi ngôn ngữ lập trình , dùng để gọi gọn các câu lệnh lặp đi lặp lại nhiều lần vào trong một hàm . Ta có thể sử dụng chúng ở bất đâu trong mã nguồn chỉ cần một câu lệnh gọi hàm 

câu lệnh 1 
câu lệnh 2 
câu lệnh 3
câu lệnh 4

hàm(){
	câu lệnh 1 
	câu lệnh 2 
	câu lệnh 3
	câu lệnh 4
}


// chỗ cần sử dụng lại 4 câu lệnh
hàm();
// Một nơi khác
hàm();
...

Kiến thức cần nhớ


    Biến

    Kiểm tra giá trị với console.log()​

    ​Kiến thức cơ bản


    Hàm thông thường​


    Cú pháp​ x Định nghĩa


    function tenFunction(){ // Hàm không tham số
    	console.log("Bạn đã gọi một hàm");
    }
    
    let diemA = 8;
    let diemB = 9;
    let diemC = 10;
    function tinhDiemTB(a,b,c){
    	return (diemA + diemB + diemC) / 3;
    }
    
    let dtb = tinhDiemTB(diemA,diemB,diemC);
    console.log(dtb); // Output : 9 
    • function : Từ khoá khai báo một hàm 
    • tenFunction : Tên để tạo định danh cho hàm giúp ta gọi hàm thông qua tên gọi
    • () : Ô chứa tham só đầu vào
    • Bên trong { } : Chứa các đoạn code thực thi khi hàm được gọi

    Hàm không tham số hữu ích trong một số trường hợp

    ​Hàm có tham số hữu ích trong một số trường hợp

    • ​Xử lý các tác vụ cần tham số đầu vào , tính toán ví dụ như tính điểm trung bình
    • ​Thường dùng để tương tác với người dùng

    ​Đối với vị dụ trên nếu bạn muốn truyền tuỳ ý tham số để tính điểm trung bình hãy tham khảo bài viết dưới đây của tôi https://lazycodet.com/239/read/736/

    Nhầm lẫn ​thường gặp


    Hiểu lầm về biến trong hàm​

    function khoiTao(){
      let a = 9;
    }
    
    khoiTao();
    
    let b = a + 9;
    
    console.log(b); // Lỗi

    ​Hiểu nhầm về hàm , bản chất biến trong hàm chỉ hoạt động trong phạm vi block-scope ( let ) khi chúng ta tạo

    ​một biến trong hàm không có nghĩa khi ta gọi hàm là có thể tạo biến ngoài hàm

    • Thực tế hàm không thể tạo ra một biến
    • Như ví dụ trên biến a chỉ hoạt động trong vùng của function khoiTao() vì vậy khi chúng ta gọi bên ngoài sẽ gây ra lỗi

    Hiểu nhầm về cách hoạt động của hàm 

    function khoiTao(){
      let a = 9;
      return a;
    }
    khoiTao();
    
    let b =  a + 2;
    console.log( 9 + khoiTao()); // KQ : 18
    console.log(b); // Lỗi
    • ​Thực tế từ khoá return trả ra giá trị của hàm chứ không trả ra một biến 

    ​Lỗi khi truyền không đủ giá trị

    let diemA = 8;
    let diemB = 9;
    let diemC = 10;
    function tinhDiemTB(a,b,c){
    	return (a + b + c) / 3;
    }
    
    let dtb = tinhDiemTB(diemA,diemB);
    console.log(dtb); // In ra NaN
    • ​Khi bạn cố gắng tính điểm trung bình đối với 2 đầu điểm nhưng hàm cần 3 tham số đầu vào 

    ​Cách khắc phục

    • ​Sử dụng phương pháp bằng cách truyền tham số động tại bài viết này : https://lazycodet.com/239/read/736/
    • Truyền tham số mặc định cho tham số đầu vào . Tuy nhiên cách này chỉ hạn chế lỗi chương trình , không được khuyến khích vì gây ra kết quả sai . Hãy tham khảo cách trên . Nhưng đối với một số công thức cố định số đầu vào bạn có thể ứng dụng cách này và lời khuyên của tôi bạn nên thêm một số câu điều kiện kiểm tra , hãy trả ra thông báo lỗi phù hợp để nhắc nhở người dùng
    • let diemA = 8;
      let diemB = 9;
      let diemC = 10;
      function tinhDiemTB(a=0,b=0,c=0){
      	if( a <= 0 || b <= 0 || c <= 0 ){
      		console.log("Vui lòng nhập tham số là số dương")
      		return 0;
      	}
      	return (a + b + c) / 3;
      }
      
      let dtb = tinhDiemTB(diemA,diemB);
      console.log(dtb); // 5.67

    Lỗi cú pháp

    ​Sai kiểu dữ liệu đầu vào

    function add(a, b) {
        return a + b; // cả 2 là số
    }
    
    console.log(add("5", 10)); // Output: "510" (string concatenation)
    • ​Trong ví dụ trên sẽ không gây lỗi trực tiếp nhưng dẫn đến kết quả bị sai sót

    Các lỗi khác

    ​Nếu có đóng góp hay liên hệ [email protected]

    ​Biến hàm


    Cú pháp x Định nghĩa​


    const helloworld = function (){
    	console.log("HelloWorld")
    }
    
    helloworld(); // output : HelloWorld
    • ​Biến hàm được tạo ra bằng cách đặt tên hàm vào một biến để gọi hàm

    So sánh với hàm thông thường​


    Hoisting ( Kéo Lên )​

    // Đối với hàm thông thường
    console.log(add(2, 3)); // Output: 5
    
    function add(a, b) {
        return a + b;
    }
    
    // Hàm biến 
    
    console.log(add(2, 3)); // Lỗi: add is not a function
    
    const add = function (a, b) {
        return a + b;
    };
    • ​Hàm thông thường : Ta quan sát ví dụ thấy hàm thông thường chưa được khai báo nhưng ở trên vẫn có thể dùng mà không gây ra lỗi . Đó là cơ chế hoisting của hàm  khi kéo tất cả các dữ liệu là function lên đầu phạm vi
    • Hàm biến : Cần khai báo trước khi gọi

    Được sử dụng để làm callback

    • Thường được sử dụng để làm một tham số để truyền vào một hàm khác goi là callback ( gọi hàm trong hàm ) 
    • Tham khảo về callback tại đây : https://lazycodet.com/169/read/607/ , callback

    Trường hợp sử dụng 

    ​Hàm thường ( Regular Function )

    ​Hàm biến ( Expression Function ) 

    • ​Khi bạn muốn dễ dàng debug
    • Khi muốn hàm có phạm vi sử dụng rộng
    • ​Khi hàm chỉ sử dụng trong một phạm vi cụ thể
    • Khi muốn truyền hàm như một tham số (callback)

    Kiến thức nâng cao


    ​Kiến thức nâng cao được tách ra thành các bài viết riêng để khiến bài viết này không trở lên quá phức tạp đối với người mới học 

    • ​Hàm mũi tên ( arrow function ) 
    • Hàm ẩn danh ( anonymous function )
    • ​Hàm thực thi ( IIFE )
    • Hàm tạo ( Generator Function )
    • Hàm xử lý đồng bộ , bất đồng bộ ( Async Function ) 
    • Hàm cấu trúc ( Constructor Function ) 
    • Hàm ràng buộc ( Bound Function )

    Tổng kết dạng bảng


    Loại hà

    Cú pháp

    Đặc điểm nổi bật

    Ứng dụng phổ biến

    Function Declaration

    ​( Hàm thông thường )

    function name() { ... }

    ​- Có hoisting (gọi trước khi định nghĩa).

    ​- Có tên hàm rõ ràng, dễ debug.

    Định nghĩa hàm toàn cục hoặc phạm vi lớn.

    Function Expression

    ​( Hàm biến )

    const name = function() { ... };

    ​- Không hoisting.

    ​- Có thể có tên hoặc không tên (anonymous).

    Lưu trữ hàm trong biến, truyền làm callback, hoặc sử dụng trong phạm vi cụ thể.

    Arrow Function

    ​( Hàm mũi tên )

    const name = () => { ... };

    ​- Không có this riêng (kế thừa từ ngoài).

    ​- Không cóarguments.

    ​- Không hoisting.

    Callback ngắn gọn, xử lý this kế thừa, hoặc viết hàm một dòng.

    IIFE

    (function() { ... })();

    ​- Thực thi ngay lập tức sau khi khai báo.

    ​- Tạo scope riêng, tránh xung đột biến toàn cục.

    Khởi tạo giá trị, tạo module hoặc đóng gói logic độc lập.

    Generator Function

    function* name() { yield value; }

    ​- Sử dụng yield để tạm dừng/thực thi lại.

    ​- Trả về một iterator.

    Xử lý luồng dữ liệu tuần tự, bất đồng bộ, hoặc lazy evaluation.

    Async Function

    async function name() { await promise; }

    ​- Trả về một Promise.

    ​- Kết hợp vớ await để xử lý bất đồng bộ dễ dàng hơn.

    Xử lý tác vụ bất đồng bộ như API calls, file I/O, hoặc timers.

    Constructor Function

    function Name() { this.property = value; }

    ​- Dùng với từ khóa new để tạo đối tượng.

    ​- Tiền thân của class trong ES6.

    Tạo đối tượng theo kiểu hướng đối tượng (OOP) trước khi có class.

    Bound Function

    const boundFunc = func.bind(context);

    - Ràng buộc giá trị this cố định cho hàm.

    Đảm bảo this luôn trỏ đến đối tượng mong muốn trong các ngữ cảnh khác nhau.

    Tham khảo​


    1. ​Cheatsheet JS
    2. Chuẩn hoá hàm
    3. Tổng hợp các bài tập về hàm ( rèn luyện tư duy - khó ) 

    Bài tập đơn giản

    1. ​Tạo hàm tính toán + , - , x , /  với 2 tham số
    2. Tạo hàm tính điểm trung bình
    3. Tạo hàm chuyển đổi từ độ C sang độ F và ngược lại 
    4. Tạo hàm tính diện tích hình vuông , hình tròn , hình chữ nhật , hình tam giác ...
    5. Tạo hàm chuyển đổi giá trị giữa 2 biến ( không sử dụng biến phụ và có sử dụng biến phụ ) 

    ​Đáp án , kèm giải thích

    • ​Bài 1
    • Bài 2
    • Bài 3
    • Bài 4
    • Bài 5