Подтвердить что ты не робот

Разница между двумя функциями? ( "функция x" vs "var x = function" )

Возможный дубликат:
JavaScript: var functionName = function() {} vs function functionName() {}

Какая разница между:

function sum(x, y) {
  return x+y;
}

// and 

var sum = function (x, y) {
    return x+y;
}

Почему один используется над другим?

4b9b3361

Ответ 1

Первая известна как именованная функция, а вторая - как анонимная функция.

Ключевое практическое отличие заключается в том, когда вы можете использовать функцию суммы. Например:-

var z = sum(2, 3);
function sum(x, y) {
    return x+y;
}

z назначается 5, тогда как это: -

var z = sum(2, 3);
var sum = function(x, y) {
    return x+y;
}

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

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

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

Ответ 2

Первое, как правило, используется по нескольким причинам:

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

    var f = function (x) { return 4; }
    
    (f)
    

    чтобы назначить 4 на f.

Есть несколько предостережений, чтобы иметь в виду, хотя. Не делайте

  var sum = function sum(x, y) { ... };

в IE 6, так как это приведет к созданию двух объектов функции. Особенно запутанно, если вы делаете

  var sum = function mySym(x, y) { ... };

Согласно стандарту, функция sum (x, y) {...} не может появляться внутри блока if или тела цикла, поэтому различные интерпретаторы будут относиться к

  if (0) {
    function foo() { return 1; }
  } else {
    function foo() { return 2; }
  }
  return foo();

по-разному. В этом случае вы должны сделать

  var foo;
  if (0) {
    foo = function () { return 1; }
  } ...

Ответ 3

Первый - это именованный оператор функции, второй присваивает выражение анонимной функции переменной.

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

var y = sum(1, 2);

function sum(x, y) {
   return x + y;
}

Но выражение функции присваивается переменной только при выполнении кода, поэтому это не работает:

// Error here because the function hasn't been assigned to sum yet.
var y = sum(1, 2);

var sum = function(x, y) {
   return x + y;
}

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

Преимущество именованного оператора функции заключается в том, что отладчики смогут отображать это имя. Хотя вы можете назвать выражения функций:

var sum = function sum(x, y) {
   return x + y;
}

Но это может сбивать с толку, поскольку два имени фактически находятся в разных областях и относятся к различным вещам.

Ответ 4

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

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

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

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

Дополнительная техническая информация

Javascript имеет три способа определения функций.

  • Ваш первый пример - объявление функции . Для создания функции используется оператор "function". Функция предоставляется во время разбора и может быть вызвана в любом месте этой области. Вы можете сохранить его позже в переменной или объекте.
  • Второй фрагмент показывает выражение функции. Это связано с использованием оператора "function" для создания функции - результат этого оператора может быть сохранен в любой переменной или объекте. Выражение функции является таким мощным. Выражение функции часто называют "анонимной функцией", поскольку оно не должно иметь имя,
  • Третий способ определения функции - конструктор "Function()" , который не показан в исходном сообщении. Не рекомендуется использовать это, поскольку он работает так же, как eval(), у которого есть свои проблемы.

Ответ 5

Разница в том, что...

Это безымянная функция

var sum = function (x, y) {
    return x+y;
}

Итак, если вы предупреждаете (суммируете); вы получаете "функцию (x, y) {return x + y;}" (безымянный) Хотя это именованная функция:

function sum(x, y) {
        return x+y;
}

Если вы предупреждаете (суммируете); теперь вы получаете "function sum (x, y) {return x + y;}" (name is sum)

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

Ответ 6

вот еще один пример: function sayHello (name) {alert ('hello' + name)}

теперь, предположим, что вы хотите изменить onclick-событие кнопки, например, он говорит "hello world"

вы не можете написать:

yourBtn.onclik = sayHello ('мир'), потому что вы должны предоставить ссылку на функцию.

то вы можете использовать вторую форму: yourBtn.onclick = function() {sayHello ('workld'); }

Ps: извините за мой плохой английский!

Ответ 7

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

$ js
js> function sum(x,y) { return x+y; }
js> sum(1,2);
3
js> sum=3
3
js> sum(1,2);
typein:4: TypeError: sum is not a function
js> sum
3