2008-09-22 3 views
41

Можно создать дубликат:
JavaScript: var functionName = function() {} vs function functionName() {}Разница между двумя функциями? ("Функция х" против "вар х = функция")

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

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

// and 

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

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

+0

Не использовать функцию имени, просто используйте анонимную функцию для инкапсуляции, предотвращая переменное загрязнение глобальной области. – 2014-06-11 13:30:36

ответ

48

Первый известен как именованные функции, где второй известно как анонимная функция.

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

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

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

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

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

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

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

-5

Они имеют в виду то же самое. Это просто синтаксический сахар. Последнее - ИМО, более раскрывающее то, что действительно делает 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 
12

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

  1. Название «Сумма» отображается в StackTrace, что делает отладку проще во многих браузерах.
  2. Название: «сумма» может использоваться внутри корпуса функции , что упрощает использование для рекурсивных функций.
  3. функции декларации «подняты» в javascript, поэтому в первом случае функция должна быть определена как .
  4. вставки Запятой вызывает

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

    присвоить 4 к f.

Следует иметь в виду несколько предостережений. Не делайте

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

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

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

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

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

другой. В этом случае, вы должны сделать

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

Хорошая мысль об утверждении if. Но я не думаю, что это правда, что функция гарантированно будет определена ровно один раз. (Или, может быть, я вас неправильно понял?) – 2008-09-22 12:45:07

1

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

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

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

Так что, если вы оповещения (сумма); Вы получаете "функция (х, у) {возвращение х + у;}" (безымянный) Хотя это именованная функция:

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

Если тревога (сумма); Теперь вы получите «функцию сумма (х, у) {возвращение х + у;}» (название сумма)

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

0

вот другой пример: функции SayHello (имя) {Alert (' привет»+ имя)}

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

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

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

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

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

3

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

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

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

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

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

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

  1. Ваш первый пример: Объявление функции. Для создания функции используется оператор «функция». Функция предоставляется во время разбора и может быть вызвана в любом месте этой области. Вы можете сохранить его позже в переменной или объекте.
  2. Ваш второй фрагмент показывает выражение функции . Это включает в себя использование функции «0» «функция» для создания функции - результат этого оператора может быть сохранен в любой переменной или объекте. Выражение функции является таким мощным. Выражение функции часто называют «анонимной функцией», поскольку оно не обязательно должно иметь имя,
  3. Третий способ определения функции - это «Конструктор функций()», который не указан в исходном сообщении , Не рекомендуется использовать это, так как он работает так же, как eval(), который имеет свои проблемы.