Lambda กับ Closure ต่างกันยังไง

ตั้งแต่แรกที่ผมได้ยินเกี่ยวกับเรื่อง Functional programming ผมก็ได้ยิน 2 คำนี้มาตลอด แต่ไม่เคยรู้ซักทีว่าเมื่อไหร่ควรใช้คำใด เมื่อไหร่เราควรเรียกว่า Lambda เมื่อไหร่เราควรเรียกว่า Closure พอวันนี้รู้แล้วก็เลยมาเล่าให้ฟังครับ ขออธิบายแบบไม่ทางการนะครับ

Lambda คือการประกาศฟังก์ชันแบบไม่มีชื่อ โดยการประกาศนี้บอกแค่เพียงว่าฟังก์ชันนี้รับพารามิเตอร์อะไรบ้าง และทำกระบวนการอะไรภายในนั้นกับพารามิเตอร์เหล่านั้น

ตัวอย่างเช่น

function(x,y) {
  return x+y;
}

ซึ่งเจ้า Lambda function นี้อาจจะถูกเรียกใช้ทันที

(function(x,y) {
  return x+y;
})(1,2) // => 3

จะถูกเก็บไว้ในตัวแปรเพื่อเรียกใช้ทีหลัง

var sum = function(x,y) {
  return x+y;
}
sum(1,2)

หรือจะถูกส่งเป็นอาร์กิวเมนต์เข้าไปให้ฟังก์ชันอื่นก็ได้

createTwice(function(x,y) {
  return x+y;
});
function createTwice(f) {
  return function(a,b) {
    return 2 * f(a,b);
  };
}

Closure คือ การที่ฟังก์ชันที่ประกาศไว้(อาจจะมีหรือไม่มีชื่อก็ได้) ทำการจับค่าตัวแปรนอกฟังก์ชันไปใช้งานเมื่อฟังก์ชันนั้นถูกเรียกใช้

var x = 1
var sumX = function(a) {
  return a + x;
}
sumX(2) // => 3

จะเห็นประโยชน์อย่างชัดเจนเมื่อฟังก์ชันที่ถูกใช้เป็นค่า return ของฟังก์ชันที่ครอบไว้อีกชั้นนึง หรือถูกส่งเป็นอาร์กิวเมนต์ไปให้ฟังก์ชันอื่น ที่ไม่สามารถเข้าถึงค่าของตัวแปรนั้นๆ ได้

function createSum(x) {
  return function(y) {
    return x + y;
  };
}
var sum1 = createSum(1);
sum1(2) // => 3

ซึ่งกฎในการจับค่านั้นอาจจะแตกต่างกันไปในแต่ละภาษาบางภาษาจะจำค่าของตัวแปร บางภาษาจะจำ reference ของตัวแปร บางภาษาตัวแปรเปลี่ยนค่าไม่ได้จึงไม่ต้องกังวลว่ามันจับค่าแบบใด

Lambda เป็นพื้นฐานของ Higher-order function และ First-class function ที่เป็นคุณสมบัติสำคัญของ functional programming
ส่วน Closure เป็นสิ่งที่ทำให้ Lambda นั้นมีประโยชน์ ไม่ใช่แค่ function ทั่วๆ ไปนั่นเองครับ

จะเห็นได้ว่าจริงๆแล้ว Lambda กับ Closure มาจากฟีเจอร์เดียวกันของภาษาเขียนโปรแกรม ต่างกันที่เป็นการมองคนละมุมของฟีเจอร์นี้เท่านั้นเองครับ

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s