Однажды отдыхая в диване, я вспомнил мимолетный замечательный ролик из своего детства, который назывался WAT. И там была такая штука как bare words, которая показывалась на примере Ruby.

image

«Голые слова» (barewords) — это слова без кавычек, которые вы можете использовать в качестве строк.

В JavaScript их, вроде как и нет, поэтому я попробовал их в него пропихнуть, что в целом получилось.

Получился вот такой код:

with(bareWords) {
    alert(Иван + Ургант)
    console.log(We, can, use, bare, words)
}
И он успешно выводил нужные фразы.
А реализовано это было вот так:

try {
    let self = this
    window.bareWords = new Proxy({}, {
        has: function(target, name) {
            return !(name in self)
        },
        get: function(target, name) {
            return name
        },
    })
} catch(e) {
    console.error('Your browser doesn\'t support bare words.')
}

Как видите, чтобы мы смогли использовать голые слова, мы использовали такие фичи джаваскрипта, как Proxy и with.

При попытке получить свойство из this, из-за происков with, запрос идет в прокси, где мы и возвращаем строковое значение вместо злобной ошибки о отсутствии переменной.

Спасибо за внимание.

image

Если что, вот ссылочка на Github
Поделиться с друзьями
-->

Комментарии (33)


  1. maxpsyhos
    14.07.2017 04:10
    +1

    Троллейбус_из_хлеба.jpg


    1. NLO
      14.07.2017 08:27

      НЛО прилетело и опубликовало эту надпись здесь


  1. arvitaly
    14.07.2017 08:36
    +2

    Да, осталось прикрутить нейронную сеть, которая будет подставлять куски кода со stackoverflow по ассоциации с введенными словами и код писать сможет любой ребенок (с) 1C
    P.S. Проверять Proxy на defined с помощью try/catch жестко.


  1. jankovsky
    14.07.2017 10:40

    гавно какое то


    1. slayeek
      14.07.2017 12:04

      Cоглашусь, но можно и корректнее :)


    1. Leonq
      14.07.2017 12:47

      Всего лишь джаваскрипт.


  1. zodchiy
    14.07.2017 12:52

    ролик из своего детства
    — 2012 год.
    Детство-то когда кончилось? Пару лет назад?


    1. mitinsvyat
      14.07.2017 13:01
      +2

      Пока еще не кончилось


      1. izzholtik
        14.07.2017 18:00

        Первые 40 лет детства самые сложные.


    1. TheShock
      14.07.2017 20:19

      Кстати, никогда не мог понять в чем прикол с Бэтменом? "...NaNNaN Batman!"?


      1. ilya310300
        14.07.2017 22:27

        1. TheShock
          14.07.2017 22:40

          Теперь понял, смешно, спасибо.


  1. artalar
    14.07.2017 13:43

    Proxy вообще практически всемогущи, но сейчас они новы и медленны, лучше их не использовать.


    1. OlegZH
      14.07.2017 14:56

      А когда их лучше использовать? Когда они станут старыми и быстрыми, но совсем ничего не смогут делать?


      1. artalar
        14.07.2017 15:03

        А когда их лучше использовать? Когда они станут старыми и быстрыми

        Да. Из этого правила можно сделать исключение, если бы были полифилы. Но для прокси — это не возможно.
        совсем ничего не смогут делать?

        Абсолютно никакой логической связи не вижу в этих словах, поясните, пожалуйста, как возраст фичи коррелируется с ее функциональностью?


        1. OlegZH
          14.07.2017 15:30

          Эта была шутка (в ответ на). Но… кто его знает? И… кто такие «полифилы»?


          1. artalar
            14.07.2017 15:32

            кто такие «полифилы»

            https://learn.javascript.ru/dom-polyfill


            1. OlegZH
              19.07.2017 16:40

              Спасибо. Было очень вкусно. Ресурс понравился. Языком заинтересовался ещё больше.


  1. justboris
    14.07.2017 14:42
    +1

    мы использовали такие фичи джаваскрипта, как Proxy и with.

    Вообще, забавно получилось. with — это отмирающая фича, остается только для обратной совместимости и запрещена в strict mode. А Proxy — совсем новинка, только-только добравшаяся до браузеров.


    Очень неожиданно встретить их вместе.


  1. OlegZH
    14.07.2017 15:02

    Вы разожгли мой аппетит. Теперь будет трудно уснуть, не узнав, что такое JavaScript, и с чём его едят.


    1. mitinsvyat
      14.07.2017 15:19

      Простите, я не хотел этого делать.


      1. OlegZH
        14.07.2017 15:31

        Лучше пожелайте мне приятного аппетита!


  1. rumkin
    14.07.2017 15:41

    А еще так можно делать ленивую инициализацию. А вообще в смысле bare words лучше воспользоваться sweet.js. Правда на символ @ претендуют декораторы и похоже, что они его получат, так что придется использовать другой символ.


    1. mitinsvyat
      14.07.2017 16:05

      Ну там компиляция какая-то. Так не честно.


      1. rumkin
        15.07.2017 03:19

        А with вообще deprecated, так что 1:1.


        1. mitinsvyat
          15.07.2017 19:27

          Го раз на раз


        1. mitinsvyat
          15.07.2017 21:25

          Испугался раз на раз, так что 2:1.


    1. Apx
      14.07.2017 18:08
      +1

      Можно # взять и тогда весь код на js можно будет читать как ленту инстаграмма (rofl)


      1. rumkin
        15.07.2017 03:22
        -1

        Шарп слишком привычен для комментариев и вряд ли пройдет жернова TC39.


        1. Large
          15.07.2017 04:48
          -2

          Он на стейдж 2 забит под приватные свойства


  1. Sirion
    14.07.2017 16:56
    +1

    А вы хитры.


    1. mitinsvyat
      14.07.2017 18:22
      +1

      Спс!


  1. DenVdmj
    15.07.2017 10:01

    Подобный трюк в lua даже проще чем в js. Я иногда использую lua-скрипты вместо bat-ников, очень удобно таким образом обращаться к командному интерпретатору, переменным среды, реестру, и, в частности, его разделу Shell Folders. За счет установки __index и __call в metatable объектов cmd, SF и ENV работает, например, такое:

    cmd.cls()
    cmd.dir 'D:'
    cmd.chcp '1251 > nul';
    cmd.pause()
    cmd.echo('ProgramFiles : ' .. ENV.ProgramFiles)
    cmd.echo('SystemDrive  : ' .. ENV.SystemDrive)
    cmd.echo('SystemRoot   : ' .. ENV.SystemRoot)
    cmd.echo('UserProfile  : ' .. ENV.UserProfile)
    cmd.echo('Common Documents: ' .. SF'Common Documents')
    cmd.echo([[HKCU\Software\TortoiseHg: ]] .. REG[[HKCU\Software\TortoiseHg]])
    cmd.pause()