2009-04-01 36 views
115

Trong một recent question, tôi đã nhận được đề xuất để nói chuyện, trong số những thứ khác, khía cạnh của JavaScript, nơi các chức năng là đối tượng 'lớp học đầu tiên'. 'Lớp đầu tiên' có ý nghĩa gì trong ngữ cảnh này, trái ngược với các đối tượng khác?Điều gì có nghĩa là 'đối tượng lớp học đầu tiên'?

EDIT (Jörg W Mittag): Chính xác Duplicate: "What is a first class programming construct?"

+1

thể trùng lặp của [là gì một lập trình lớp đầu tiên xây dựng?] (Http://stackoverflow.com/questions/646794/what-is-a-first-class- lập trình-xây dựng) –

Trả lời

144

Để báo Wikipedia:

Trong khoa học máy tính, ngôn ngữ lập trình được cho là hỗ trợ chức năng hạng nhất (hoặc chức năng theo nghĩa đen) nếu nó xử lý các hàm như đối tượng hạng nhất. Cụ thể, điều này có nghĩa rằng ngôn ngữ hỗ trợ xây dựng chức năng mới trong thực hiện một chương trình, lưu trữ chúng trong cấu trúc dữ liệu, đi qua chúng như đối số cho các chức năng khác, và trở về chúng như các giá trị của chức năng khác.

Trang này cũng illustrates nó đẹp:

Thực sự, giống như bất kỳ khác biến

  • Một chức năng là một thể hiện của kiểu Object
  • Một chức năng có thể có các thuộc tính và có liên kết quay lại phương thức hàm tạo của nó
  • Bạn có thể lưu trữ các chức năng trong một biến
  • Bạn có thể vượt qua các chức năng như một tham số để một hàm
  • Bạn có thể trả lại chức năng từ một hàm

cũng đọc comment TrayMan của, thú vị ...

+9

Trích dẫn wikipedia là tốt đẹp và dandy, nhưng mô tả được viết bằng một ngôn ngữ cho các nhà khoa học và không cho geeks. Tất cả điều đó có nghĩa là gì? Câu cuối cùng trong câu nói đó là vagu. – Spoike

+1

@Spoike, true ... đã cung cấp tài nguyên javascript. –

+14

Thuận tiện cho một ngôn ngữ có chức năng hạng nhất cũng có các hàm bậc cao hơn, trái với giới hạn đối với các hàm bậc nhất, sẽ loại trừ các hàm hạng nhất. (Mặc dù thứ tự cao hơn, không phải là hạng nhất có thể.) – TrayMan

2

Điều đó có nghĩa là các hàm là các đối tượng, với kiểu và hành vi. Chúng có thể được tạo động, được truyền xung quanh như bất kỳ đối tượng nào khác và thực tế là chúng có thể được gọi là một phần của giao diện của chúng.

2

Điều đó có nghĩa là chức năng thực sự được kế thừa từ Object. Vì vậy, bạn có thể vượt qua nó xung quanh và làm việc với nó như với bất kỳ đối tượng khác.

Trong C# tuy nhiên bạn cần phải hạn chế các đại biểu hoặc phản ánh để chơi xung quanh với các chức năng. (điều này gần đây tốt hơn với các biểu thức lambda)

0

tôi đoán khi nào đó là lớp đầu tiên trong một ngôn ngữ, nó có nghĩa là nó được hỗ trợ bởi cú pháp của nó chứ không phải là thư viện hoặc cú pháp. ví dụ: các lớp trong C không phải là lớp đầu tiên

5

Thử nghiệm đơn giản. Nếu bạn có thể làm điều này bằng ngôn ngữ của mình (ví dụ như Python):

def double(x): 
    return x*x 

f = double 

print f(5) #prints 25 

Ngôn ngữ của bạn đang xử lý các chức năng như đối tượng lớp học đầu tiên.

+3

Nhưng tôi có thể làm điều này trong C++: int hai lần (int x) {return x << 1; } int (* f) (int) = hai lần; std :: cout << (* f) (5) << std :: endl; Điều đó có nghĩa là C++ xử lý các chức năng như các đối tượng lớp đầu tiên (với một cú pháp hài hước)? –

+1

Cho đến khi bạn có thể tạo một hàm bên trong một hàm, tôi muốn nói không. – cHao

+1

C chức năng con trỏ hỗ trợ (một định nghĩa rất hạn chế) chức năng lớp học đầu tiên nhưng chức năng không phải là đối tượng. Các con trỏ hàm trong C không chứa trạng thái hoặc hành vi. –

37

Khái niệm "first-class functions" bằng ngôn ngữ lập trình được giới thiệu bởi nhà khoa học máy tính người Anh Christopher Strachey vào những năm 1960. Công thức nổi tiếng nhất của nguyên tắc này có thể là Structure and Interpretation of Computer Programs bởi Gerald Jay Sussman và Harry Abelson:

  • Chúng có thể được đặt tên theo biến.
  • Chúng có thể được chuyển làm đối số cho các thủ tục.
  • Chúng có thể được trả lại dưới dạng kết quả của các thủ tục.
  • Chúng có thể được bao gồm trong cấu trúc dữ liệu.

Về cơ bản, điều đó có nghĩa là bạn có thể thực hiện với mọi chức năng mà bạn có thể thực hiện với tất cả các phần tử khác bằng ngôn ngữ lập trình. Vì vậy, trong trường hợp JavaScript, nó có nghĩa là mọi thứ bạn có thể làm với một số nguyên, một chuỗi, một mảng hoặc bất kỳ loại đối tượng nào khác, bạn có thể cũng thực hiện với các chức năng.

12

Phê duyệt đầy đủ hơn về công thức của Strachey-Sussman-Abelson. Vì vậy, nếu ngôn ngữ của bạn hỗ trợ một cấu trúc như vậy thì bạn đã có một chức năng như một lớp học đầu tiên ngôn ngữ :)

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... :) 

Nói tóm lại, bất cứ điều gì là một đối tượng hạng nhất nếu nó hoạt động bằng ngôn ngữ như một loại thao tác trạng thái của đối tượng hoặc kiểu đối tượng. Đơn giản chỉ cần một cái gì đó bạn có thể hoạt động trên và vượt qua xung quanh báo cáo và đánh giá trong các biểu thức cùng một lúc. Hoặc thậm chí ngắn hơn: khi bạn có thể nghĩ về một hàm làm đối tượng có thể được gọi thêm.

+1

'người ngoài hành tinh (như (phụ nữ));' bwahahahaha – agpt

8

Chức năng JavaScript là các hàm hạng nhất có nghĩa là các hàm và đối tượng được coi là giống nhau. Các hàm có thể được lưu trữ dưới dạng một biến bên trong một đối tượng hoặc một mảng cũng như nó có thể được chuyển như một đối số hoặc được trả về bởi một hàm khác. Điều đó làm cho chức năng "công dân hạng nhất trong JavaScript"

JavaScript sử dụng cú pháp ký hiệu chữ, khiến cho việc nắm bắt thực tế là trong các hàm JavaScript là đối tượng.

Ví dụ ..

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

cả declerations là tương đương. Bằng cách sử dụng new, chúng tôi đang gọi hàm tạo của đối tượng. Cũng bằng cách sử dụng {} (phím tắt JavaScript được gọi là chữ), chúng tôi đang gọi hàm xây dựng của một đối tượng. {} chỉ là một đại diện ngắn hơn cho việc khởi tạo hàm tạo.

Hầu hết các ngôn ngữ sử dụng new từ khóa để tạo đối tượng, vì vậy hãy tạo đối tượng JavaScript.

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

Như bạn thấy chúng tôi tạo ra một đối tượng tên chức năng.

Tạo cùng chức năng tên đối tượng bằng cách sử dụng biểu thức hàm JavaScript ..

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

Ở đây chúng ta sẽ tạo một hàm tên đối tượng.

7

Trong các hàm javascript là các đối tượng lớp đầu tiên vì nó có thể làm nhiều hơn những gì các đối tượng có thể làm.

  • Hàm là trường hợp của loại đối tượng.

Function instanceof Object //returns true

Giống như một đối tượng một hàm có thể có các thuộc tính và có thể có một liên kết trở lại hàm xây dựng của nó.

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

  • Chức năng có thể được lưu trữ trong một biến như là một giá trị.

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

  • Chức năng có thể được thông qua như là đối số cho các chức năng khác

function callback (foo){ 
 
     foo(); 
 
} 
 

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

  • Bạn có thể trả về một hàm từ một hàm

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

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

  • có thể được lưu trữ trong một biến như một tài liệu tham khảo.

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

+0

Một đối tượng cũng có thể làm tất cả những điều đó. – Taurus

Các vấn đề liên quan