Оголошення функції як var замість функції


28

Все більше я бачу, як функції оголошуються подібними

var foo = function() {

    // things
};

Замість того, як я навчився, як

function foo() {

    // things
}

Яка різниця? Краща ефективність? Область застосування? Чи слід використовувати цей метод?


Варто зазначити, що в JavaScript функціонують першокласні громадяни . Це дозволяє обходити поведінку так само, як предмети. Це дуже корисно для зворотних дзвінків та делегування, серед іншого.
Кріс Бай

Область застосування . Обгортання назви змінної "// things" по суті / сподіваємось, запобігає зіткненням імен "// things", яку вона обгортає, з включеними іншими JavaScript (файлами). Ще один спосіб подумати про це - створити простір імен "foo".
radarbob

Відповіді:


25

var foo = function() {} визначає змінну, на яку посилається анонімна функція.

function foo() {}визначає названу функцію foo.

Або можна передати ім’я як параметри функції, і будь-яку інстанцію, якщо призначене використання призначене для OOP.

Зрештою, який з них ви використовуєте, багато в чому продиктовано вашим конкретним випадком використання (Javascript такий веселий;)). Якщо ви в кінцевому підсумку використовуєте попередню, я настійно пропоную вам назвати функцію:

var foo = function MY_function() {}. Ця умова іменування допомагає вашій наставці виклику налагоджувача не бути марною.


1
Потрапив на функцію () МОЙ ...
Ерік Reppen

1
@Demian Brecht, а як щодо var foo = function foo () {...} підхід?
shabunc

@shabunc: А що з цим? Це вказано в останньому абзаці моєї відповіді.
Дем'ян Брехт

@Demian Brecht, ні, насправді в останньому абзаці викликається змінна, fooа функція називаєтьсяMY_function
shabunc

@shabunc: ім'я не має значення. Важливим є значення в стопку виклику. Наприклад, [NAMESPACE] _ [fn name] - це умова, яку використовує Mozilla. Саме ім'я не має значення, доки ваша конвенція буде узгоджена протягом усього проекту.
Дем'ян Брехт

13

вираз функції:

//someFunction(); //wouldn't work when uncommented
var someFunction = function(){ alert('yay'); };

Вираз func у цьому випадку є анонімним, але призначається var для довідки. Це відрізняється від міченого оператора функції наступними способами:

  • його не можна підняти (зателефонувавши до того, як буде визначено)
  • new someFunction().constructor.name === 'someFunction';//false екземпляри не отримують імені var для constructor.name, оскільки посилання на функцію призначається var, але var, а не функція, прив'язується до імені var

У позначеному оператором функції:

//someFunction(); //works when uncommented
function someFunction(){ alert('yay'); }
  • підйомні роботи
  • new someFunction().constructor.name === 'someFunction'; //true ім'я прив’язується безпосередньо до функції.

Взагалі кажучи, насправді немає великої причини виражати вар, якщо ви не хочете, щоб виклики не завершувались, якщо все переміщуються або ви визначаєте / призначаєте метод в одному рядку. Я фактично вважаю підйомник корисним для організації об’єктів із внутрішніми визначеннями функцій та методів у нижній частині, щоб я міг перейти до фактичної поведінки об'єкта та зробити однорядкові загальнодоступні визначення методу (просто призначивши функцій this.з тим самим іменем) все в одному місце для зручності використання. Ви завжди повинні намагатися використовувати мічені оператори для конструкторів, IMO, щоб ви могли ідентифікувати "тип" об'єкта через його конструктор.


8

Ваш перший приклад - це вираз, а другий приклад - твердження . Визначення функцій як виразів забезпечує більшу гнучкість у тому, де може відбуватися визначення, до чого ви можете його призначити, що ви можете передати його як параметр тощо.

Наприклад:

SomeThing('abc', function(a,b) {return a*b;});

проти ...

function tmp(a,b) { 
    return a*b;
}

SomeThing('abc', tmp);

Більш складні приклади стали б нецензурно складними без синтаксису вираження функції.

Подивіться на /programming/111102/how-do-javascript-closures-work


4

Основна практична відмінність - це підйомники. Наприклад:

foo(); // alerts 'hello'
function foo() {alert('hello');}

проти

foo(); // throws an error since foo is undefined
var foo = function() {alert('hello');}

Також це невизначена поведінка

function foo(){
  if (true) {
    function bar(){}
  }
  bar();
}

поки це нормально.

function foo(){
  if (true) {
    var bar = function(){}
  }
  bar();
}

7
Немає абсолютно нічого поганого у визначенні функції всередині функції в JS. У JS не так багато місць, де ви не можете визначити функцію.
Ерік Реппен

2
@ErikReppen Ви точно не можете використовувати декларації функції в нефункціональних блоках (наприклад, в операторі if). Я не можу знайти місце, де я читав, що їх не можна використовувати в іншій функції.
Остін

@Austin Немає нічого поганого і з визначенням функції в ifоператорі!
Тім

@Austin: Можливо, ти читаєш це у w3schools? ;)
Дем'ян Брехт

2
@ErikReppen Функції виразів можна використовувати в будь-якому місці. Декларацій функції не може бути. Дивіться stackoverflow.com/questions/10069204/…
Остін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.