Что подразумевается под «первоклассным объектом»? - PullRequest
132 голосов
/ 01 апреля 2009

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

РЕДАКТИРОВАТЬ (Jörg W Mittag): точный дубликат: «Что такое первоклассная программная конструкция?»

Ответы [ 11 ]

162 голосов
/ 01 апреля 2009

Цитировать Википедия :

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

Эта страница также иллюстрирует это прекрасно:

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

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

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

42 голосов
/ 01 апреля 2009

Понятие «первоклассных функций» на языке программирования было введено британским ученым Кристофером Стрейчи в 1960-х годах. Наиболее известная формулировка этого принципа, вероятно, содержится в Структура и интерпретация компьютерных программ Джеральда Джея Суссмана и Гарри Абельсона:

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

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

13 голосов
/ 04 июня 2013

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

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 голосов
/ 20 ноября 2014

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

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

Например ..

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

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

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

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

Как видите, мы создали имя объекта function .

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

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

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

8 голосов
/ 24 апреля 2017

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

  • Функция является экземпляром типа Object.

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);
5 голосов
/ 01 апреля 2009

Простой тест. Если вы можете сделать это на своем языке (например, Python):

def double(x):
    return x*x

f = double

print f(5) #prints 25

Ваш язык рассматривает функции как объекты первого класса.

2 голосов
/ 01 апреля 2009

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

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

2 голосов
/ 01 апреля 2009

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

1 голос
/ 21 августа 2018

Определение на сайте Mozilla является кратким и ясным. По их словам,

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

И

функция - это «подпрограмма», которая может вызываться внешним (или внутренним в случае рекурсии) кодом функции. Как и сама программа, функция состоит из последовательности операторов, называемых телом функции. Значения могут быть переданы в функцию, и функция вернет значение.

0 голосов
/ 23 апреля 2018

Простые в JavaScript функции - это объекты первого класса, то есть функции имеют тип Object, и их можно использовать первоклассным образом, как и любой другой объект (String, Array, Number и т. Д.), Поскольку они на самом деле объекты сами. Они могут «храниться в переменных, передаваться в качестве аргументов функциям, создаваться внутри функций и возвращаться из функций

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...