jsrosetta

Hàm

Hàm hạng nhất

Hàm hạng nhất, closure và currying trong Node.js so với hàm-giá-trị và closure trong Go, Rust, Swift và Java.

Phiên bản tối thiểu
Node.js ≥ 12.20Go ≥ 1.0Rust ≥ 1.26Swift ≥ 2.0Java ≥ 25
Đã chạy thử trên
Node.js 24.12.0Go 1.27.1Rust 1.98.1Swift 6.2.4Java 25.0.4.1

Code Node.js là ES module: lưu file .mjs hoặc đặt "type": "module" trong package.json.

Trong Node.js, hàm là giá trị hạng nhất: gán được cho biến, truyền làm tham số, trả về từ hàm khác, và ghép lại thành hàm mới. Go cũng coi hàm là giá trị, chỉ khác là mọi kiểu hàm phải khai báo tường minh và không có bind — closure lo phần đó. Rust và Swift cũng coi hàm là giá trị hạng nhất, có closure y hệt Go. Java thì gói hàm trong các functional interface (Function, BinaryOperator, Supplier...) từ package java.util.function, và biến bị closure "bắt" (capture) phải là "effectively final" — không được gán lại sau khi khai báo.

Gán và truyền hàm

// gán hàm cho một biến
const add = (a, b) => a + b;
 
// truyền hàm làm tham số (higher-order function)
const apply = (fn, a, b) => fn(a, b);
console.log(apply(add, 2, 3)); // 5

Closure: hàm nhớ trạng thái của chính nó

function makeCounter() {
  let count = 0;
  return () => ++count;
}
 
const counter = makeCounter();
console.log(counter(), counter(), counter()); // 1 2 3

Currying / partial application

const addTen = add.bind(null, 10);
console.log(addTen(5)); // 15

Tham khảo: github.com/miguelmota/golang-for-nodejs-developers#first-class-functions