Как переменные JS const компилируются в дружественный к браузеру код, чтобы они были доступны только для чтения? - PullRequest
0 голосов
/ 30 января 2019

У меня есть следующая переменная:

const x = ['item']

Затем я попытался использовать компилятор реального времени Babel, и он дал мне следующий скомпилированный код:

"use strict";
var x = ["item"];

Теперь, когда я пытаюсьприсвойте что-нибудь еще (x = {}) переменной x, это выдает мне ошибку.Я нигде не вижу, как я не могу изменить x в скомпилированном коде!В общем, var редактируемые, верно?

Может кто-нибудь помочь мне понять это?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Если я попробую выводить babel, я могу назначить новое значение для x, и оно просто работает.Причина этого заключается в том, что выводимый код представляет собой ECMAScript 5 и не имеет понятия consts.Вы можете попробовать это, изменив const на var в примере 'JavaScript Demo: Statement - Const' на MDN .

Таким образом, babel скомпилирует (или "перенесет") его какприсваиваемая переменная, потому что другого пути нет.Но в процессе этого он проверяет ваш исходный код, чтобы увидеть, если вы не делаете присваивание x, и выдает ошибку, если вы делаете.

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

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

0 голосов
/ 30 января 2019

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

...