В чем преимущество назначения функции для переменной?


Ответы:


8

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

    function sum() {}

Хороший способ проверить различия - это вызвать .ToString () для них и увидеть разницу, или вы можете сделать console.log (sum.name). Один даст действительное имя, а другой - ничего, а именно анонимную функцию (назначенную для переменной). Также есть особенности, например, когда var sum = function () {} определяется во время выполнения, а функция sum () {} определяется во время анализа.


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

12
Это объясняет разницу , но я не думаю, что это объясняет преимущество .
Кит Томпсон

какая разница между временем разбора и временем выполнения?
Верн Анчета

1
Не имеет ничего общего с именованными функциями, вы все равно можете назначить именованную функцию переменной
Хуан Мендес

5

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

if (true) {
  function foo() {}
}
try {
  function foo(){}
}
switch (true) {
  default:
    function foo(){}
}

Все это не определено стандартом, и браузеры делают разные вещи, см. Https://stackoverflow.com/questions/10069204/function-declarations-inside-if-else-statements . Так что если вам иногда приходится использовать другой стиль, для согласованности вы можете захотеть делать это всегда

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


3

Я не эксперт по Javascript, поэтому возьмите это с собой. Я думаю, что в некоторых случаях люди могут сделать это для стиля, и то же самое можно сделать, просто написав "function sum () {...}"

Однако присвоение функции переменной является очень мощным приемом в функциональном программировании. Если вы знакомы с ООП, это чем-то похоже на полиморфизм. Подумайте о классическом примере базового класса Animal и производных классов Cat / Dog. Вы можете написать код, который работает с Animal, но когда он вызывает функцию, эта функция может выполнять различную работу в зависимости от типа экземпляра.

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

Например, предположим, вы пишете алгоритм для представления 10000 точек данных в окне, ширина которого составляет всего 500 пикселей. Каждый пиксель будет представлять 20 точек данных, и для их представления вам необходимо объединить эти 20 точек данных в одно значение.

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

...
displayValue = aggregate( numbersInOnePixel );
...

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

aggregate = function sum() {...}
aggregate = function min() {...}
aggregate = function max() {...}
aggregate = function average() {...}

0

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

Один из аргументов в пользу этого var =стиля, который я слышал, заключается в том, что он согласуется с тем, как вы объявляете нормальные переменные. Это ограничивает число используемых вами языковых функций и упрощает представление вашей программы кому-то, кто плохо знаком с Javascript.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.