Разница между "анонимной функцией" и "литералом функции" в JavaScript?

Книга Изучение JavaScript определяет анонимные функции следующим образом:

Функции - это объекты. Таким образом, вы можете создать их - как и String или Array или другой тип - с помощью конструктора и назначения функции переменной. В следующем коде создается новая функция с помощью конструктора Function, причем тело функции и аргумент передаются как аргументы:

var sayHi = new Function("toWhom", "alert('Hi' + toWhom);");

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

Является ли это правильным определением "анонимной функции" в JavaScript? Если нет, то какая анонимная функция и есть ли какая-либо разница между анонимной функцией и литералом функции?

Ответ 1

Выражения функций и объявления функций

Поскольку вас интересуют функции, вот некоторые важные вещи, которые нужно знать.

var abc = function() { ... } известен как выражение функции. Переменной будет присвоена анонимная функция во время выполнения, хотя объявление переменной будет поднято в верхней части текущего контекста выполнения (области).

Однако выражению функции также может быть присвоено имя, так что его можно вызвать внутри своего тела, чтобы сделать его рекурсивным. Имейте в виду У IE есть некоторые проблемы с этим. Когда вы назначаете ему имя, это определенно не анонимная функция.

Функция, такая как function abc() { ... }, называется объявлением функции. Его определение поднимается до вершины его сферы. Его имя доступно внутри него и его родительской области.

Дополнительная литература.


Ваш пример

Это анонимная функция, но назначается переменной sayHi.

Как Šime Vidas упоминает, что новый Function объект создается с помощью оператора new, а аргументы и тело функции передаются как строки. Полученный объект присваивается sayHi.

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

Кроме того, функции, созданные с помощью Function не образуют закрытие.

Я бы использовал этот метод, если по какой-то причине мне нужно было создать Function с его аргументами и/или телом, доступными только мне как строку.

В реальном мире вы бы сделали...

var sayHi = function(toWhom) {
   alert('Hi' + toWhom);
};

Также см. комментарии Felix и Šime для хорошего обсуждения и дальнейшего разъяснения.

Ответ 2

Я думаю, что более широкое и более приемлемое определение анонимной функции - это функция, созданная без имени.

Ответ 3

Анонимная функция - это просто функция без имени.

function(a, b){
  return a + b;
}

Вышеприведенный код будет бесполезен, поскольку он не имеет имени, с которым вы могли бы его назвать. Поэтому они обычно назначаются переменной.

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

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

function bob(a){
  alert(a());
}

bob(function(){
  return 10*10;
})

Ответ 4

Это:

new Function("toWhom", "alert('Hi' + toWhom);")

и это:

function(toWhom) { alert('Hi' + toWhom); }

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

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

Ответ 5

function foo(){
    alert("i'm foo, nice to meet you!");
}
var bar = function(){
    alert("I am an anonymous function assigned to the variable \"bar\"");
}