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

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

У меня есть переменная с именем foo и function с именем foo.

//variable followed by function declaration
var foo="bar";
function foo(){
  return "bar";
}
//function declaration followed by variable
function foo(){
  return "bar";
}
var foo="bar";
//When I call foo it returns string bar;
//When I enquired foo() it throws error

Что происходит здесь? Почему переопределение функции имени переменной?

4b9b3361

Ответ 1

Когда я вызываю foo, он возвращает строку bar;

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

Код эквивалентен как

function foo() {
    return "bar";
}
// Overwriting the value
var foo = "bar"

Итак, в обоих случаях вывод будет 'bar'.

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

Для получения дополнительной информации о подъеме функций см. Обзор области видимости и подъема Javascript

Когда я спросил foo(), он undefined

foo здесь нет функции, это строка. Таким образом, foo() выдаст ошибку

Uncaught TypeError: a не является функцией (...)

Ответ 2

В более ясном и более явном виде объявления переменных последний учитывает:

    var foo = "bar";
    var foo = function () {
        return "bar";
    };
    console.log(foo);

вывод - это функция

и разворот:

var foo = function () {
    return "bar";
};
var foo = "bar";
console.log(foo);

имеет вывод "bar".

Ответ 3

В JavaScript функции обрабатываются при вводе соответствующей области. Переменные обрабатываются, когда интерпретатор получает свое объявление. Поэтому в вашем примере сначала обрабатываются функции, имя foo используется последней функцией, а затем перезаписывается переменными.

Обратите внимание, что если вы объявите свою функцию следующим образом

var foo = function() {}

он фактически не обрабатывается в начале, а также перезаписывает заранее объявленные переменные.

Ответ 4

var foo="bar";

var foo = function(){
  return "bar";
};

Они одинаковы. Не пропустите, чтобы положить ; в конец строки.

Ответ 5

оба случая вернут строку "bar"

в основном javascript захватывает все функции и помещает их в верхнюю часть файла его называемый подъем.

поэтому объявление строки будет перезаписывать выражение функции в обоих случаях;