ในคำถามเมื่อเร็ว ๆนี้ฉันได้รับคำแนะนำให้พูดคุยในแง่มุมอื่น ๆ ของ JavaScript ที่ฟังก์ชั่นเป็นวัตถุ 'ชั้นหนึ่ง' 'ชั้นหนึ่ง' หมายถึงอะไรในบริบทนี้เมื่อเทียบกับวัตถุอื่น ๆ
แก้ไข (Jörg W Mittag): ซ้ำซ้อน: "การเขียนโปรแกรมชั้นหนึ่งคืออะไร"
ในคำถามเมื่อเร็ว ๆนี้ฉันได้รับคำแนะนำให้พูดคุยในแง่มุมอื่น ๆ ของ JavaScript ที่ฟังก์ชั่นเป็นวัตถุ 'ชั้นหนึ่ง' 'ชั้นหนึ่ง' หมายถึงอะไรในบริบทนี้เมื่อเทียบกับวัตถุอื่น ๆ
แก้ไข (Jörg W Mittag): ซ้ำซ้อน: "การเขียนโปรแกรมชั้นหนึ่งคืออะไร"
คำตอบ:
ในการอ้างถึงWikipedia :
ในวิทยาการคอมพิวเตอร์ภาษาการเขียนโปรแกรมถูกกล่าวเพื่อสนับสนุนฟังก์ชั่นชั้นหนึ่ง (หรือฟังก์ชั่นตามตัวอักษร) ถ้ามันปฏิบัติหน้าที่เป็นวัตถุชั้นหนึ่ง โดยเฉพาะนั่นหมายความว่าภาษารองรับการสร้างฟังก์ชั่นใหม่ในระหว่างการดำเนินการของโปรแกรมจัดเก็บไว้ในโครงสร้างข้อมูลผ่านพวกเขาเป็นข้อโต้แย้งไปยังฟังก์ชั่นอื่น ๆ และกลับพวกเขาเป็นค่าของฟังก์ชั่นอื่น ๆ
หน้านี้ยังแสดงให้เห็นอย่างสวยงาม:
จริงๆแล้วก็เหมือนกับตัวแปรอื่น ๆ
ยังอ่านความคิดเห็นของ TrayMan ที่น่าสนใจ ...
แนวคิดของ"ฟังก์ชั่นชั้นหนึ่ง"ในภาษาการเขียนโปรแกรมได้รับการแนะนำโดยนักวิทยาศาสตร์คอมพิวเตอร์ชาวอังกฤษChristopher Stracheyในทศวรรษที่ 1960 การกำหนดหลักการที่มีชื่อเสียงที่สุดของหลักการนี้น่าจะอยู่ในโครงสร้างและการตีความโปรแกรมคอมพิวเตอร์โดย Gerald Jay Sussman และ Harry Abelson:
โดยพื้นฐานแล้วหมายความว่าคุณสามารถทำหน้าที่ทุกอย่างที่คุณสามารถทำได้กับองค์ประกอบอื่น ๆ ทั้งหมดในภาษาการเขียนโปรแกรม ดังนั้นในกรณีของ JavaScript ก็หมายความว่าทุกอย่างที่คุณสามารถทำอะไรกับจำนวนเต็มสตริงอาร์เรย์หรือชนิดอื่น ๆ ของวัตถุที่คุณสามารถยังทำอย่างไรกับฟังก์ชั่น
การอนุมัติที่สมบูรณ์ยิ่งขึ้นของสูตรของ 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... :)
ในระยะสั้นสิ่งใดเป็นวัตถุชั้นหนึ่งถ้ามันทำหน้าที่ในภาษาที่เรียงลำดับการจัดการของรัฐของวัตถุหรือชนิดของวัตถุ สิ่งที่คุณสามารถดำเนินการและส่งต่อคำสั่งและประเมินผลในนิพจน์ในเวลาเดียวกัน หรือสั้นกว่า: เมื่อคุณนึกถึงฟังก์ชั่นเป็นวัตถุที่สามารถเรียกใช้เพิ่มเติมได้
ฟังก์ชั่นจาวาสคริปต์เป็นฟังก์ชั่นชั้นหนึ่งความหมายฟังก์ชั่นและวัตถุจะถือว่าเป็นสิ่งเดียวกัน ฟังก์ชั่นสามารถเก็บไว้เป็นตัวแปรภายในวัตถุหรืออาร์เรย์เช่นเดียวกับที่สามารถส่งผ่านเป็นอาร์กิวเมนต์หรือถูกส่งกลับโดยฟังก์ชั่นอื่น ที่ทำให้ฟังก์ชั่น "พลเมืองชั้นหนึ่งใน 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;
}
ที่นี่เราไปเราเพิ่งสร้างฟังก์ชั่นชื่อวัตถุ
ในฟังก์ชั่นจาวาสคริปต์เป็นวัตถุชั้นหนึ่งเพราะสามารถทำได้มากกว่าสิ่งที่วัตถุสามารถทำได้
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);
ทดสอบอย่างง่าย หากคุณสามารถทำได้ในภาษาของคุณ (Python เป็นตัวอย่าง):
def double(x):
return x*x
f = double
print f(5) #prints 25
ภาษาของคุณกำลังปฏิบัติหน้าที่เป็นวัตถุชั้นหนึ่ง
มันหมายความว่าฟังก์ชั่นเป็นวัตถุที่มีประเภทและพฤติกรรม พวกเขาสามารถสร้างแบบไดนามิกส่งผ่านเป็นวัตถุอื่น ๆ และความจริงที่ว่าพวกเขาสามารถเรียกได้ว่าเป็นส่วนหนึ่งของส่วนต่อประสาน
หมายความว่าฟังก์ชั่นนั้นได้รับมรดกจาก Object จริงๆ เพื่อให้คุณสามารถผ่านมันไปและทำงานกับมันเหมือนกับวัตถุอื่น ๆ
ใน c # คุณต้องละเว้นผู้ได้รับมอบหมายหรือการไตร่ตรองเพื่อเล่นกับฟังก์ชั่น (สิ่งนี้ดีขึ้นมากเมื่อเร็ว ๆ นี้ด้วยการแสดงออกแลมบ์ดา)
คำจำกัดความบนเว็บไซต์ Mozilla นั้นกระชับและชัดเจน ตามที่พวกเขา,
ใน JavaScript, ฟังก์ชั่นเป็นวัตถุชั้นแรกเพราะพวกเขาสามารถมีคุณสมบัติและวิธีการเช่นเดียวกับวัตถุอื่น ๆ สิ่งที่แตกต่างจากวัตถุอื่นคือสามารถเรียกใช้ฟังก์ชันได้ กล่าวโดยย่อพวกเขาเป็นวัตถุฟังก์ชั่น
และ
ฟังก์ชั่นเป็น "โปรแกรมย่อย" ที่สามารถเรียกใช้โดยรหัสภายนอก (หรือภายในในกรณีของการเรียกซ้ำ) ไปยังฟังก์ชั่น เช่นเดียวกับโปรแกรมตัวเองฟังก์ชั่นประกอบด้วยลำดับของคำสั่งที่เรียกว่าฟังก์ชั่นร่างกาย สามารถส่งผ่านค่าไปยังฟังก์ชันและฟังก์ชันจะส่งคืนค่า
ฉันเดาว่าบางสิ่งบางอย่างในชั้นหนึ่งในภาษาก็หมายความว่ามันได้รับการสนับสนุนโดยไวยากรณ์ของมันมากกว่าห้องสมุดหรือน้ำตาลประโยค ตัวอย่างเช่นคลาสใน C ไม่ใช่คลาสแรก
ง่าย ๆ ใน JavaScript ฟังก์ชั่นเป็นวัตถุชั้นหนึ่งที่มีฟังก์ชั่นเป็นประเภทวัตถุและพวกเขาสามารถนำมาใช้ในลักษณะที่ชั้นหนึ่งเช่นวัตถุอื่น ๆ (String, Array, Number, ฯลฯ ) เนื่องจากพวกเขาเป็นวัตถุจริง ตัวเอง พวกเขาสามารถ“ เก็บไว้ในตัวแปรส่งผ่านเป็นข้อโต้แย้งไปยังฟังก์ชั่นที่สร้างขึ้นภายในฟังก์ชั่นและส่งกลับจากฟังก์ชั่น