Вопрос по javascript – Разница между двумя функциями? («Функция x» против «var x = function») [дубликат]

46

Possible Duplicate:
JavaScript: var functionName = function() {} vs function functionName() {}

В чем разница между:

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

// and 

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

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

не использовать функцию имени, просто используйте анонимную функцию для инкапсуляции, предотвращая загрязнение переменной глобальной области видимости Amitābha

Ваш Ответ

7   ответов
50

а вторая - как анонимная функция.

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

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, функция еще не была назначена.

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

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

1

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

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

Так что если вы настороже (сумма); Вы получаете & quot; function (x, y) {return x + y; } & Quot; (Безымянный) Пока это именованная функция:

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

Если вы предупреждаете (сумма); теперь вы получаете & quot; функциюsum(х, у) {вернуть х + у; } & Quot; (имя сумма)

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

3

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

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

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

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

More technical info

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

Your first example is a function declaration. This uses the "function" statement to create a function. The function is made available at parse time and can be called anywhere in that scope. You can still store it in a variable or object property later. Your second snippet shows a function expression. This involves using the "function" operator to create a function - the result of that operator can be stored in any variable or object property. The function expression is powerful that way. The function expression is often called an "anonymous function" because it does not have to have a name, The third way of defining a function is the "Function()" constructor, which is not shown in your original post. It's not recommended to use this as it works the same way as eval(), which has its problems.
0

теперь предположим, что вы хотите изменить событие onclick для кнопки, например, так: «hello world»

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

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

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

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

6

а второй назначает выражение для анонимной функции переменной.

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

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;
}

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

12

The name "sum" shows up in the stacktrace which makes debugging easier in many browsers. The name "sum" can be used inside the function body which makes it easier to use for recursive functions. function declarations are "hoisted" in javascript, so in the first case, the function is guaranteed to be defined exactly once.

Semicolon insertion causes

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

(f)

to assign 4 to 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; }
  } ...
Я тоже не понимаю точно единожды. Могут присутствовать разные определения одного и того же имени функции, последнее определение выигрывает.
Хороший вопрос по поводу заявления if. Но я не думаю, что это правда, что функция гарантированно будет определена ровно один раз. (А может я тебя не так понял?)
Я не уверен, что понимаю, что вы говорите в пункте 4 ...
Есть ли у вас какие-либо ссылки на ваше заявление относительно назначения именованной функции переменной? Насколько я вижу, создана только одна функция.
Извините, пункт 4 немного искажен. Я имел в виду, что var f = function f () {return 4; } / * перевод строки здесь * / (0); интерпретируется как var f = (function f () {return 4;}) (0);
-5

нее является IMO более показательным, что на самом деле делает 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

Похожие вопросы