Точное значение литерала функции в JavaScript

В JavaScript есть как литералы объекта, так и литералы функций.

Объектный литерал:

myObject = {myprop:"myValue"}

Функциональный литерал:

myFunction = function() {
   alert("hello world");
}

Каково значение слова буквальный? Можно ли сказать, что у Java есть литералы метода?

public void myMethod() {
    System.out.println("are my literal");
}

6 ответов

Решение

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

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

Поэтому, когда вы даете имя метода, он не может быть литералом метода.

Самая большая разница в том, как / когда он анализируется и используется. Возьми свой пример,

myFunction = function() {
   alert("hello world");
}

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

Если вы используете другой способ,

function myFunction(){
   alert("hello world");
}

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

Пожалуйста, обратитесь к этому вопросу также.

Добавить:

Функциональный литерал в JavaScript является синонимом выражения функции.

Параллельно с функциональными выражениями функциональные литералы могут иметь необязательный идентификатор (имя).

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

Функция Literal

Функциональные объекты создаются с помощью функциональных литералов:

// Создать переменную с именем add и сохранить в ней // функцию, которая добавляет два числа.

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

Функциональный литерал состоит из четырех частей.

Первая часть - функция зарезервированного слова.

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

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

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

Функциональный литерал может появляться везде, где может появляться выражение...

источник: JavaScript: хорошие части - Дуглас Крокфорд

Это означает:

myFunction = function () {
   alert("hello world");
};

это выражение функции / литерал функции, но также:

myFunction = function myFunction() {
   alert("hello world");
};

это выражение функции / литерал функции.

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

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

Литерал объекта - это объект, который вы создаете на лету и в линии. То же самое относится к литералу функции. Но пример, который вы приводите, на самом деле похож на обычное объявление функции:

function foo()
{
    alert('bar');
}

Перемещается в верхнюю часть области, где она преобразуется в:

var foo = function()
{
    alert('bar');
};

Имеет смысл, когда функции могут быть переданы как аргументы / возвращаемые значения:

var processed = (function(someFunc)//<-- argument name
{
    return function()
    {
        alert('I\'ll call some function in 2 seconds, get ready');
        setTimeout(someFunc,2000);//<-- passes a reference to foo, as an argument to setTimeout
    }
})(foo);//pass reference to function object foo here

Это только начало всех видов вещей, которые вы можете делать с JS, при условии, что вы перестанете рассматривать его как подмножество Java....

Официальное определение в ECMA-262 не найдено.

Но согласно Википедии и многим другим PL, которые я узнал, литералы являются выражением ценностей.

Это означает:

function() {alert("hello world")}

является буквальным, в то время как:

function hello_world() {alert("hello world")}

не является. Потому что последний выражает не только значение, но и ссылку.

Я проголосовал за ответ всенола, но теперь думаю, что это неправильно.

function literal это не function, но значение function,

Для программиста на ассемблере это что-то вроде block of code это хранится в .text область памяти.

Тогда люди хотели бы спросить, что function на самом деле.

function на самом деле указатель или ссылка на function literalкак на любом языке программирования.


Например,

public void myMethod() {
    System.out.println("are my literal");
}

это myMethod это метод.

{
    System.out.println("are my literal");
}

И это метод литерал, который Java не поддерживает.

Другие вопросы по тегам