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

Что это в JavaScript?

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

Я смотрел на какой-то скомпилированный код (из Babel), и он выдал это:

(0, _posSaleTipJs.shouldShowTippingOnCheckoutFlow)()

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

Исходный код, из которого он был скомпилирован, был:

shouldShowTippingOnCheckoutFlow()

Ответы:


1

Вы можете прочитать об операторе запятой:

Оператор запятой оценивает каждый из своих операндов (слева направо) и возвращает значение последнего операнда.

Пример

(x += 1, x)

дает тот же результат, что и:

++x

Что происходит с нотацией (0,...)

Разница между:

_posSaleTipJs.shouldShowTippingOnCheckoutFlow()

а также:

(0, _posSaleTipJs.shouldShowTippingOnCheckoutFlow)()

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

В первом случае this будет синонимом _posSaleTipJs, а во втором случае this останется глобальным объектом (или undefined в строгом режиме, см. Babel строгий режим преобразования плагин).

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

Следующая функция стрелки ES6 и немедленный вызов будут иметь тот же эффект:

((func) => func())(_posSaleTipJs.shouldShowTippingOnCheckoutFlow);

Но тем не менее, нотация (0, ...)() кажется наиболее кратким способом вызова функции, сохраняя при этом this global или undefined.

01.03.2016
  • Я не могу понять использование оператора запятой в приведенном примере OP. Почему бы напрямую не позвонить _posSaleTipJs.shouldShowTippingOnCheckoutFlow(). Есть идеи? 01.03.2016
  • Первоначальный вызов не имел базового объекта (контекста), поэтому результаты одинаковы, оба вызываются с this, изначально установленным в значение undefined, то же, что и внутри функции (т. е. undefined или глобальный объект) зависит от того, является код строгим или нет соответственно. 01.03.2016
  • Верно, хотя из вопроса мы не знаем, что this уже было бы (в исходном коде) до того, как вызов был сделан. Я предполагаю, что Babel следует этому шаблону, даже если в некоторых случаях это может быть необязательно. 01.03.2016
  • Спасибо за объяснение, но поскольку мы можем использовать _posSaleTipJs.shouldShowTippingOnCheckoutFlow.apply(this) для той же цели, мне интересно, дает ли использование оператора запятая какое-то преимущество в производительности? 01.03.2016
  • Я думаю, что это может иметь небольшое преимущество в производительности: интуитивно вызов apply кажется более тяжелым, чем применение оператора ,. Но на самом деле, со всеми этими умными оптимизациями в современных парсерах JavaScript, трудно сказать. Нотация , также немного короче по количеству символов. 01.03.2016

  • 2

    Первая часть кода

    (0, _posSaleTipJs.shouldShowTippingOnCheckoutFlow)
    

    возвращает значение _posSaleTipJs.shouldShowTippingOnCheckoutFlow. Возвращаемое значение, очевидно, является функцией. Используя круглые скобки () в возвращаемой функции

    (0, _posSaleTipJs.shouldShowTippingOnCheckoutFlow)()
    

    вы фактически вызываете функцию. В результате он вызывает вашу функцию shouldShowTippingOnCheckoutFlow.

    Может быть несколько причин, по которым компилятор выдал такой код:

    • Минификация
    • Оптимизация производительности
    • Изоляция области

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

    01.03.2016
  • Изоляция области? Как вызов может повлиять на область действия, он лексический (т.е. основан на том, где сделан вызов, а не сейчас). 01.03.2016
  • @RobG, ну, я никогда не работал с Babel, но в целом, если мы говорим о препроцессорах JS, у вас может быть файл, представляющий модуль, и все функции, определенные в модуле, во время компиляции изолированы от глобальной области видимости, поэтому они доступны только внутри модуля. например Функция в модуле 1, определенная как function myFunc() { ... }, будет скомпилирована как module1.myFunc = function() { ... } и вызвана как module1.myFunc(), а не просто как myFunc(). Просто обратите внимание, что я действительно говорю в общем, возможно, это совсем не ваш случай. 01.03.2016
  • Новые материалы

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

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

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

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

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

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

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