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

Что это означает, когда переменная равна функции?

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

В JavaScript, какова цель определения переменной как функции? Я уже видел это соглашение и не понимаю его полностью.

Например, в какой-то момент в script функция вызывается так:

whatever();

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

function whatever(){

}

Вместо этого я увижу переменную с именем whatever, которая определена как функция, например:

var whatever = function(){

}

Какова цель этого? Зачем вам это делать вместо того, чтобы просто называть функцию?

4b9b3361

Ответ 1

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


Вот одна причина:

var whatever;

if (some_condition) {
    whatever = function() {
        // Do something
    };
}
else {
    whatever = function() {
        // Do something else
    };
}
whatever();

В инициализации библиотеки вы можете увидеть такой код, который должен обрабатывать различия в реализации (например, различия между веб-браузерами, a'la IE attachEvent и стандартным addEventListener). Вы не можете сделать эквивалент с объявлением функции:

if (some_condition) {
    function whatever() {    // <=== DON'T DO THIS
        // Do something
    }
}
else {
    function whatever() {    // <=== IT INVALID
        // Do something else
    }
}
whatever();

... они не указаны в структурах управления, поэтому JavaScript-устройствам разрешено делать то, что они хотят, а разные двигатели сделали разные вещи. (Изменить: снова см. Примечание ниже, они указаны сейчас.)

Отдельно существует большая разница между

var whatever = function() {
    // ...
};

и

function whatever() {
    // ...
}

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

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

Итак, рассмотрим:

function foo() {
    doSomething();
    doSomethingElse();
    console.log("typeof bar = " + typeof bar); // Logs "function"

    function bar() {
    }
}

тогда

function foo() {
    doSomething();
    doSomethingElse();
    console.log("typeof bar = " + typeof bar); // Logs "undefined"

    var bar = function() {
    };
}

В первом примере с объявлением декларация обрабатывается до запуска doSomething и другого поэтапного кода. Во втором примере, поскольку это выражение, оно выполняется как часть поэтапного кода, поэтому функция не определена выше (переменная определена выше, потому что var также "поднят" ).

И завершение: на данный момент вы не можете сделать это в целом на веб-сайте клиентской стороны:

var bar = function foo() { // <=== Don't do this in client-side code for now
    // ...
};

Вы должны это сделать, он называется выражением именованной функции, и это выражение функции, которое дает функции правильное имя. Но различные JavaScript-движки в разное время ошибались, и IE продолжал очень сильно ошибаться до самого недавнего времени.


Обновление для ES2015 +

Как и в ES2015 (иначе ES6), в спецификацию были добавлены объявления функций внутри блоков.

Строгий режим

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

Итак, это:

"use strict";
if (Math.random() < 0.5) {
  foo();
  function foo() {
    console.log("low");
  }
} else {
  foo();
  function foo() {
    console.log("high");
  }
}
console.log(typeof foo); // undefined

Ответ 2

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

var callback = function() { console.log('done', result)}

var dosomething = function(callback) {
    //do some stuff here
    ...
    result = 1;
    callback(result);
}

Так как функции являются объектами в javascript, вы можете расширить их также с помощью свойств и методов.

Ответ 3

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

Ответ 4

Функции в JavaScript - это объекты; Другими словами, это ценности. Таким образом, вы всегда можете установить переменную для ссылки на функцию независимо от того, как определена функция:

function foo() { ... }

var anotherFoo = foo;
anotherFoo(); // calls foo

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

Ответ 5

Если вы объявите functionvariable, используя "var", внутри функции, переменная может только получить доступ к этой функции. Когда вы выходите из функции, переменная уничтожается. Эти переменные называются локальными переменными. Вы можете иметь локальные переменные с тем же именем в разных функциях, потому что каждый из них распознается только функцией, в которой он объявлен.