Nano Hash - криптовалюты, майнинг, программирование

Область действия переменных (Подъем) в Javascript

Один из моих друзей проходил онлайн-викторину и задал мне вопрос, на который я не смогла ответить.

var global = false;

function test() {
  global = true;
  return false;
  function global() {}
}

console.log(global); // says false (As expected)
test();
console.log(global); // says false (Unexpected: should be true)

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

var foo = 1;
function bar() {
    return foo;
    foo = 10;
    function foo() {}
    var foo = 11;
}

bar();
console.log(foo); //says 1 (But should be 11) Why 1 this time ??

Вот демонстрация JSBin и JSBIN Demo2 для экспериментов.

PS: Если убрать function global() {} из test(), то нормально запускается. Может кто-нибудь помочь мне понять, почему это происходит?


  • Я не добавляю ответ в редактирование, поскольку ответ от @SLaks все еще актуален. var foo = 11 ЕСТЬ 11 в локальной области действия этой функции. foo = 10 игнорируется, а function foo() по-прежнему создает локальную переменную foo, а также var foo 06.02.2014
  • bar() возвращает функцию 06.02.2014
  • @DavidBarker Да, теперь я понимаю. Спасибо за ваше хорошее дополнение к ответу Слака. 06.02.2014
  • Обратите внимание, что переменная global в функции на самом деле локальная… 06.02.2014
  • Вы также можете выполнить этот процесс с помощью инструментов разработчика Chrome. 06.02.2014

Ответы:


1

Операторы var и операторы объявления функций "поднимаются" наверх своей области видимости.
Таким образом, function global(){} в вашей функции создает локальное global имя.

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

function test() {
    var global = function() {};   // hoisted; 'global' now local
    global = true;
    return false;
}
06.02.2014
  • @ΘεόφιλοςΜουρατίδης: Нет; вот что значит подъем. 06.02.2014
  • Нет, не должно. Функции, назначенные так, как написано в ОП, всегда будут подниматься, как говорится в ответе. 06.02.2014
  • @^ Вот о чем я думаю. 06.02.2014
  • @ΘεόφιλοςΜουρατίδης adequatelygood.com/JavaScript-Scoping-and-Hoisting.html 06.02.2014
  • Отличный ответ, SLaks; Я добавил переписанную функцию компилятора, чтобы сделать ее более понятной для непосвященных... Надеюсь, вы не возражаете! 06.02.2014
  • @SLaks Gotcha..Теперь я получил твой ответ..Большое спасибо!! 06.02.2014
  • @ΘεόφιλοςΜουρατίδης Несколько лет назад эта статья открыла мне глаза, я просто хотел поделиться ;) 06.02.2014

  • 2

    Отвечу на вторую часть вашего вопроса,

    Если предположить, что функции поднимаются вверх вместе с переменными var

    bar();
    console.log(foo); //says 1 (But should be 11) Why 1 this time ??
    

    Вместо этого вы должны попробовать console.log(bar()); console.log(foo);. Однако то, что подъем делает с вашей функцией, таково:

    function bar() {
        var foo;
        function foo() {}
        return foo;
        foo = 10;
        foo = 11;
    }
    

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

    06.02.2014
  • Большое спасибо за объяснение. +1 Теперь я понял. Статья Уоррена мне очень помогла. Я не знал, что в мире JS существует такая вещь, как подъем +1 06.02.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..