2009-04-01 2 views
115

В recent question я получил предложения по обсуждению, среди прочего, аспекта JavaScript, где функции являются объектами «первого класса». Что означает «первый класс» в этом контексте, в отличие от других объектов?Что означает «объект первого класса»?

EDIT (Йорг W Mittag): Точный дубликат: "What is a first class programming construct?"

+1

возможно дубликат [Что такое первый класс программирования построить?] (Http://stackoverflow.com/questions/646794/what-is-a-first-class- programming-construct) –

ответ

144

Цитирую Wikipedia:

В информатике, программирование язык называется поддержка функций первого класса (или функции literal), если он рассматривает функции как первоклассных объектов. В частности, это означает, что язык поддерживает строительство новых функций во время выполнения программы, хранить их в структурах данных, передавая их в качестве аргументов других функций, и возвращают их в качестве значений других функций.

Эта страница также illustrates это красиво:

Действительно, так же, как и любой другой переменной

  • А функция является экземпляром типа объекта
  • Функция может иметь свойства и имеет ссылку на свой конструктор метод
  • Вы может сохранять функцию в переменной
  • Вы можете передать функцию в качестве параметра другой функции
  • Вы можете вернуть функцию из функции

также прочитать комментарий TrayMan в, интересной ...

+9

Цитата: Википедия хорошая и денди, но описание написано на языке для ученых, а не для вундеркиндов. Что, черт возьми, все это значит? Последнее предложение в этой цитате - vagu. – Spoike

+1

@Spoike, true ... предоставлен ресурс javascript. –

+14

Удобно, что язык с первоклассными функциями также имеет функции более высокого порядка, а не ограничивается функциями первого порядка, что исключает первоклассные функции. (Хотя более высокий порядок, не первоклассный, возможен.) – TrayMan

2

Это означает, что функции являются объектами с типом и поведением. Они могут быть динамически построены, переданы как любой другой объект, и тот факт, что их можно назвать, является частью их интерфейса.

2

Это означает, что функция фактически наследует объект. Чтобы вы могли передавать его и работать с ним, как с любым другим объектом.

В C# однако вам нужно воздерживаться от делегатов или размышлений, чтобы играть с функциями. (в последнее время это заметно улучшилось с лямбда-выражениями)

0

Я предполагаю, что когда что-то является первым классом на языке, это означает, что оно поддерживается его синтаксисом, а не библиотекой или синтаксическим сахаром. например, классы в C не являются первоклассными

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) << станд :: епсИ; Означает ли это, что C++ рассматривает функции как объекты первого класса (с забавным синтаксисом)? –

+1

Пока вы можете создать функцию внутри функции, я хочу сказать «нет». – cHao

+1

Поддержка указателей функций C (очень ограниченное определение) функций первого класса, но функции не являются объектами. Указатели функций в C не содержат состояния или поведения. –

37

Понятие "first-class functions" на языке программирования было введено британским ученым-программистом Christopher Strachey в 1960-х годах. Самая известная формулировка этого принципа, вероятно, в Structure and Interpretation of Computer Programs Джеральд Джей Зуссмана и Гарри Абельсоном:

  • Они могут быть названы переменными.
  • Они могут передаваться в качестве аргументов в процедуры.
  • Они могут быть возвращены в качестве результатов процедур.
  • Они могут быть включены в структуры данных.

В принципе, это означает, что вы можете делать с функциями все, что вы можете делать со всеми остальными элементами на языке программирования. Таким образом, в случае JavaScript это означает, что все, что вы можете сделать с помощью Integer, String, Array или любого другого объекта Object, можно также с помощью .

12

Более полное одобрение формулировки Стрэхи-Суссмана-Абельсона. Так что, если ваш язык поддерживает такую ​​конструкцию, то у вас есть функция в качестве первого класса языка :)

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

Короче говоря, все, что является объектом первого класса, если он действует на языке как манипуляция со структурой объекта или типа объекта. Просто что-то, что вы можете оперировать и обрабатывать заявления и оценивать в выражениях одновременно. Или даже короче: когда вы можете думать о функции как об объекте, который может быть дополнительно вызван.

+1

'инопланетяне (как (женщины));' bwahahahaha – agpt

8

Функции JavaScript являются первоклассными функциями, означающими, что функции и объекты рассматриваются как одно и то же. Функции могут быть сохранены как переменная внутри объекта или массива, а также могут быть переданы в качестве аргумента или возвращены другой функцией. Это делает функцию «первоклассных граждан в JavaScript»

JavaScript использует синтаксис буквенного обозначения, который затрудняет полное понимание того факта, что в функциях JavaScript есть объекты.

Например ..

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

оба declerations эквивалентны. Используя new, мы вызываем функцию-конструктор объекта. Кроме того, используя {} (ярлык JavaScript, называемый литералами), мы вызываем функцию построения объекта. {} - это просто краткое представление для создания экземпляра конструктора.

Большинство языков использует new ключевое слово для создания объекта, поэтому давайте создадим объект JavaScript.

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

Как вы видите, мы создали имя объекта функции.

Создание такой же функции имени объекта с использованием выражения функции JavaScript ..

Здесь мы идем, мы только что создали функцию имени объекта.

7

В функциях javascript это объекты первого класса, потому что они могут делать намного больше, чем могут сделать объекты.

  • Функция - это экземпляр типа объекта.

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(){ 
 
\t  return function(){console.log('working!')}; 
 
    } 
 

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

  • Может храниться в переменной в качестве ссылки.

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

+0

Объект может делать все это. – Taurus

Смежные вопросы