Можем ли мы изменить контекст выполнения JavaScript браузера с объекта Window на что-то еще? - PullRequest
0 голосов
/ 05 мая 2018

Предположим, у меня есть устаревший файл с именем module.js, который выглядит примерно так:

a=1;

Это по умолчанию присоединяется к объекту window, загрязняющему область действия global (фактически window) при его запуске в браузере.

Могу ли я вместо этого присоединить его к другому объекту без изменения содержимого исходного кода?

Поскольку единственной реальной проблемой является контекст выполнения и ничто иное, идеальным решением было бы что-то вроде этого:

change execution context from window to module object;
execute the code;
change execution context from module to window object;

Если это невозможно, добавить обертки (например, IIFE) в исходный код можно, если внутреннее содержимое не изменилось. Для изменения внутреннего содержимого требуется полное сканирование кода, что является дорогостоящим.

Я могу, например, обернуть его в такую ​​функцию (✓):

function module()
{
    a=1;
}

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

Я не хочу делать что-то подобное (✗):

module = function module()
{
    return a=1;
}

потому что нам нужно добавить return везде, где есть назначение, а это означает сканирование всего кода.

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

1 Ответ

0 голосов
/ 05 мая 2018

Ответ на первый вопрос: нет, невозможно изменить контекст выполнения по умолчанию в браузере. window - это специальная переменная, и присвоение ей чего-либо еще не изменит контекст выполнения по умолчанию. См. Глобальный объект в MDN. И вот иллюстрация

(function() {
  window = {}
  a = 5 // leaking declaration
  var b = 10
})()

console.log(a) // a is on global scope
//console.log(b) // exception b is not defined in this scope
var b = 5
window = new Object()
window.c = 5
console.log(window.b) // 5 
console.log(c)  // 5

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

  • jscodeshift позволяет писать codemods, которые являются функциями, которые получают код и применяют к нему преобразования. Это, наверное, самый мощный инструмент в этой категории.
  • ESLint позволяет вам устанавливать правила (например, не использовать глобальные переменные) и иметь опцию --fix, которая будет применять автоматические исправления в некоторых случаях, например, переход от одинарных к двойным кавычкам (это в основном для правила, связанные со стилем).
  • красивее - это средство форматирования кода, имеющее отношение только к внешнему виду кода: отступы, пробелы и т. Д.
  • AST Explorer онлайн-инструмент, который позволяет вам увидеть внутреннюю часть всех вышеперечисленных инструментов, очень полезную, чтобы понять, как она работает, и попробовать код на небольших примерах.
...