'วัตถุชั้นหนึ่ง' มีความหมายอย่างไร


146

ในคำถามเมื่อเร็ว ๆนี้ฉันได้รับคำแนะนำให้พูดคุยในแง่มุมอื่น ๆ ของ JavaScript ที่ฟังก์ชั่นเป็นวัตถุ 'ชั้นหนึ่ง' 'ชั้นหนึ่ง' หมายถึงอะไรในบริบทนี้เมื่อเทียบกับวัตถุอื่น ๆ

แก้ไข (Jörg W Mittag): ซ้ำซ้อน: "การเขียนโปรแกรมชั้นหนึ่งคืออะไร"


คำตอบ:


179

ในการอ้างถึงWikipedia :

ในวิทยาการคอมพิวเตอร์ภาษาการเขียนโปรแกรมถูกกล่าวเพื่อสนับสนุนฟังก์ชั่นชั้นหนึ่ง (หรือฟังก์ชั่นตามตัวอักษร) ถ้ามันปฏิบัติหน้าที่เป็นวัตถุชั้นหนึ่ง โดยเฉพาะนั่นหมายความว่าภาษารองรับการสร้างฟังก์ชั่นใหม่ในระหว่างการดำเนินการของโปรแกรมจัดเก็บไว้ในโครงสร้างข้อมูลผ่านพวกเขาเป็นข้อโต้แย้งไปยังฟังก์ชั่นอื่น ๆ และกลับพวกเขาเป็นค่าของฟังก์ชั่นอื่น ๆ

หน้านี้ยังแสดงให้เห็นอย่างสวยงาม:

จริงๆแล้วก็เหมือนกับตัวแปรอื่น ๆ

  • ฟังก์ชั่นเป็นตัวอย่างของประเภทวัตถุ
  • ฟังก์ชั่นสามารถมีคุณสมบัติและมีลิงค์กลับไปที่วิธีการสร้าง
  • คุณสามารถจัดเก็บฟังก์ชันในตัวแปร
  • คุณสามารถส่งผ่านฟังก์ชันเป็นพารามิเตอร์ไปยังฟังก์ชันอื่นได้
  • คุณสามารถคืนค่าฟังก์ชั่นจากฟังก์ชั่น

ยังอ่านความคิดเห็นของ TrayMan ที่น่าสนใจ ...


11
การอ้างถึงวิกิพีเดียเป็นเรื่องที่ดีและสวยงาม แต่คำอธิบายนั้นเขียนขึ้นเป็นภาษาสำหรับนักวิทยาศาสตร์ ห่าหมายความว่ายังไงล่ะ ประโยคสุดท้ายในข้อความนั้นคือ vagu
Spoike

1
@Spoike เป็นความจริง ... ให้ทรัพยากรจาวาสคริปต์
Sander Versluys

16
ภาษาที่สะดวกสบายที่มีฟังก์ชั่นชั้นหนึ่งก็มีฟังก์ชั่นการสั่งซื้อที่สูงกว่าเมื่อเทียบกับการ จำกัด ฟังก์ชั่นอันดับหนึ่งซึ่งจะแยกออกจากฟังก์ชั่นชั้นหนึ่ง (แม้ว่าจะสูงกว่าการสั่งซื้อไม่ได้ชั้นแรกเป็นไปได้.)
TrayMan

5
ฉันไม่พบสิ่งใดที่ไม่ชัดเจนในคำพูดของ Wikipedia แต่ลิงค์เพิ่มเติมนั้นยอดเยี่ยม
ProfK

4
ลิงก์ไม่ทำงานอีกต่อไป (หลังจาก 8 ปี)
doubleOrt

47

แนวคิดของ"ฟังก์ชั่นชั้นหนึ่ง"ในภาษาการเขียนโปรแกรมได้รับการแนะนำโดยนักวิทยาศาสตร์คอมพิวเตอร์ชาวอังกฤษChristopher Stracheyในทศวรรษที่ 1960 การกำหนดหลักการที่มีชื่อเสียงที่สุดของหลักการนี้น่าจะอยู่ในโครงสร้างและการตีความโปรแกรมคอมพิวเตอร์โดย Gerald Jay Sussman และ Harry Abelson:

  • อาจถูกตั้งชื่อโดยตัวแปร
  • อาจถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังโพรซีเดอร์
  • อาจถูกส่งคืนเป็นผลลัพธ์ของขั้นตอน
  • อาจรวมอยู่ในโครงสร้างข้อมูล

โดยพื้นฐานแล้วหมายความว่าคุณสามารถทำหน้าที่ทุกอย่างที่คุณสามารถทำได้กับองค์ประกอบอื่น ๆ ทั้งหมดในภาษาการเขียนโปรแกรม ดังนั้นในกรณีของ JavaScript ก็หมายความว่าทุกอย่างที่คุณสามารถทำอะไรกับจำนวนเต็มสตริงอาร์เรย์หรือชนิดอื่น ๆ ของวัตถุที่คุณสามารถยังทำอย่างไรกับฟังก์ชั่น


14

การอนุมัติที่สมบูรณ์ยิ่งขึ้นของสูตรของ Strachey-Sussman-Abelson ดังนั้นหากภาษาของคุณรองรับโครงสร้างเช่นนั้นคุณจะมีฟังก์ชั่นเป็นภาษาชั้นหนึ่ง :)

var men = function (objectOfAdmiration) {
  return objectOfAdmiration();
};
men.isSweetHeart = true;

var women = function (objectOfAdmiration) {
  return objectOfAdmiration();
};
women.isSweetHeart = true;

var aliens = function (objectOfAdmiration) {
  return objectOfAdmiration();
};

function like(obj){
  if (obj.isSweetHeart) {
      return function (){ return "Holy TRUE!"}; 
  }
  else {
      return function (){ return "Holy CRAP!"};
  }
}

alert("Men like women is " + men(like(women))); // -> "Holly TRUE!"
alert("Women like men is " + women(like(men))); // -> "Holly TRUE!"

alert("Men like aliens is " + men(like(aliens))); // -> "Holly CRAP!"
alert("Aliens like women is " + aliens(like(women))); // -> "Holly TRUE!" :)

//women(like(aliens)); //  Who knows? Life is sometimes so unpredictable... :)

ในระยะสั้นสิ่งใดเป็นวัตถุชั้นหนึ่งถ้ามันทำหน้าที่ในภาษาที่เรียงลำดับการจัดการของรัฐของวัตถุหรือชนิดของวัตถุ สิ่งที่คุณสามารถดำเนินการและส่งต่อคำสั่งและประเมินผลในนิพจน์ในเวลาเดียวกัน หรือสั้นกว่า: เมื่อคุณนึกถึงฟังก์ชั่นเป็นวัตถุที่สามารถเรียกใช้เพิ่มเติมได้


9

ฟังก์ชั่นจาวาสคริปต์เป็นฟังก์ชั่นชั้นหนึ่งความหมายฟังก์ชั่นและวัตถุจะถือว่าเป็นสิ่งเดียวกัน ฟังก์ชั่นสามารถเก็บไว้เป็นตัวแปรภายในวัตถุหรืออาร์เรย์เช่นเดียวกับที่สามารถส่งผ่านเป็นอาร์กิวเมนต์หรือถูกส่งกลับโดยฟังก์ชั่นอื่น ที่ทำให้ฟังก์ชั่น "พลเมืองชั้นหนึ่งใน JavaScript"

JavaScript ใช้สัญกรณ์สัญพจน์ตามตัวอักษรซึ่งทำให้ยากที่จะเข้าใจความจริงที่ว่าในฟังก์ชั่น JavaScript เป็นวัตถุ

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

var youObj1 = new Object();
// or
var youObj1 = {};

declerations ทั้งสองจะเทียบเท่า โดยการใช้newเรากำลังเรียกฟังก์ชั่นการสร้างของวัตถุ นอกจากนี้โดยใช้{}(ทางลัด JavaScript เรียกว่าตัวอักษร) เรากำลังเรียกใช้ฟังก์ชันการก่อสร้างของวัตถุ {}เป็นเพียงการแสดงที่สั้นลงสำหรับ instantiating นวกรรมิก

ภาษาส่วนใหญ่ใช้newคำสำคัญในการสร้างวัตถุดังนั้นให้สร้างวัตถุ JavaScript

var myFunction = new Function("a",  "b", 'return a_b');

ในขณะที่คุณเห็นว่าเราสร้างชื่อวัตถุฟังก์ชั่น

การสร้างฟังก์ชั่นชื่อวัตถุเดียวกันโดยใช้ฟังก์ชั่นการแสดงออก JavaScript

var myFunction = function myFunction(a,b) {
    return a+b;
}

ที่นี่เราไปเราเพิ่งสร้างฟังก์ชั่นชื่อวัตถุ


9

ในฟังก์ชั่นจาวาสคริปต์เป็นวัตถุชั้นหนึ่งเพราะสามารถทำได้มากกว่าสิ่งที่วัตถุสามารถทำได้

  • ฟังก์ชั่นเป็นตัวอย่างของประเภทวัตถุ

Function instanceof Object //returns true

ฟังก์ชั่นสามารถมีคุณสมบัติและสามารถมีลิงค์กลับไปที่ฟังก์ชั่นคอนสตรัคเตอร์ของมัน

 var o = {}; // empty object 'o'
    o.a = 1 ; 
    o.b = 2 ; 

    console.log(o.a); // 1
    console.log(o.b); // 2 


    function foo(){};
    foo.a = 3 ; 
    foo.b = 4 ; 

    console.log(foo.a);  // logs 3
    console.log(foo.b);  // logs 4 

  • ฟังก์ชั่นสามารถเก็บไว้ในตัวแปรเป็นค่า

  var foo = function(){}; 
    console.log(foo); // function(){}

  • ฟังก์ชั่นสามารถส่งผ่านเป็นข้อโต้แย้งไปยังฟังก์ชั่นอื่น ๆ

function callback (foo){
      foo();
}

callback(function(){console.log('Successfuly invoked as an argument inside function callback')})

  • คุณสามารถส่งคืนฟังก์ชั่นจากฟังก์ชั่น

 function foo(){
	    return function(){console.log('working!')};
    }

    var bar = foo();
    bar(); // working!

  • สามารถเก็บไว้ในตัวแปรเป็นข้อมูลอ้างอิง

    var sum = function (a,b){return a+b}  
    sum(4,4);


วัตถุสามารถทำทุกอย่างได้เช่นกัน
doubleOrt

5

ทดสอบอย่างง่าย หากคุณสามารถทำได้ในภาษาของคุณ (Python เป็นตัวอย่าง):

def double(x):
    return x*x

f = double

print f(5) #prints 25

ภาษาของคุณกำลังปฏิบัติหน้าที่เป็นวัตถุชั้นหนึ่ง


3
แต่ฉันสามารถทำได้ใน C ++: int สองครั้ง (int x) {return x << 1; } int (* f) (int) = สองครั้ง; มาตรฐาน :: ศาล << (* ฉ) (5) << มาตรฐาน :: endl; นั่นหมายความว่า C ++ ปฏิบัติต่อฟังก์ชั่นเป็นวัตถุชั้นหนึ่ง (พร้อมกับไวยากรณ์ที่ตลก) หรือไม่?
โทมัส L Holaday

1
จนกว่าคุณจะสามารถสร้างฟังก์ชั่นภายในฟังก์ชั่นฉันต้องการที่จะบอกว่าไม่มี
cHao

1
พอยน์เตอร์ฟังก์ชัน C สนับสนุน (นิยามที่ จำกัด มาก) ฟังก์ชั่นชั้นหนึ่ง แต่ฟังก์ชั่นไม่ใช่วัตถุ ตัวชี้ฟังก์ชันใน C ไม่มีสถานะหรือลักษณะการทำงาน
Steven Kramer

2

มันหมายความว่าฟังก์ชั่นเป็นวัตถุที่มีประเภทและพฤติกรรม พวกเขาสามารถสร้างแบบไดนามิกส่งผ่านเป็นวัตถุอื่น ๆ และความจริงที่ว่าพวกเขาสามารถเรียกได้ว่าเป็นส่วนหนึ่งของส่วนต่อประสาน


2

หมายความว่าฟังก์ชั่นนั้นได้รับมรดกจาก Object จริงๆ เพื่อให้คุณสามารถผ่านมันไปและทำงานกับมันเหมือนกับวัตถุอื่น ๆ

ใน c # คุณต้องละเว้นผู้ได้รับมอบหมายหรือการไตร่ตรองเพื่อเล่นกับฟังก์ชั่น (สิ่งนี้ดีขึ้นมากเมื่อเร็ว ๆ นี้ด้วยการแสดงออกแลมบ์ดา)


2

คำจำกัดความบนเว็บไซต์ Mozilla นั้นกระชับและชัดเจน ตามที่พวกเขา,

ใน JavaScript, ฟังก์ชั่นเป็นวัตถุชั้นแรกเพราะพวกเขาสามารถมีคุณสมบัติและวิธีการเช่นเดียวกับวัตถุอื่นสิ่งที่แตกต่างจากวัตถุอื่นคือสามารถเรียกใช้ฟังก์ชันได้ กล่าวโดยย่อพวกเขาเป็นวัตถุฟังก์ชั่น

และ

ฟังก์ชั่นเป็น "โปรแกรมย่อย" ที่สามารถเรียกใช้โดยรหัสภายนอก (หรือภายในในกรณีของการเรียกซ้ำ) ไปยังฟังก์ชั่น เช่นเดียวกับโปรแกรมตัวเองฟังก์ชั่นประกอบด้วยลำดับของคำสั่งที่เรียกว่าฟังก์ชั่นร่างกาย สามารถส่งผ่านค่าไปยังฟังก์ชันและฟังก์ชันจะส่งคืนค่า


0

ฉันเดาว่าบางสิ่งบางอย่างในชั้นหนึ่งในภาษาก็หมายความว่ามันได้รับการสนับสนุนโดยไวยากรณ์ของมันมากกว่าห้องสมุดหรือน้ำตาลประโยค ตัวอย่างเช่นคลาสใน C ไม่ใช่คลาสแรก


0

ง่าย ๆ ใน JavaScript ฟังก์ชั่นเป็นวัตถุชั้นหนึ่งที่มีฟังก์ชั่นเป็นประเภทวัตถุและพวกเขาสามารถนำมาใช้ในลักษณะที่ชั้นหนึ่งเช่นวัตถุอื่น ๆ (String, Array, Number, ฯลฯ ) เนื่องจากพวกเขาเป็นวัตถุจริง ตัวเอง พวกเขาสามารถ“ เก็บไว้ในตัวแปรส่งผ่านเป็นข้อโต้แย้งไปยังฟังก์ชั่นที่สร้างขึ้นภายในฟังก์ชั่นและส่งกลับจากฟังก์ชั่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.