Я нашел решение, используя global.consoleLog = v => this.log(v));
. Теперь переменная consoleLog доступна везде.
ОРИГИНАЛЬНЫЙ ВОПРОС
В настоящее время я участвую в соревновании Battlecode. Мой вопрос касается Javascript и доступа к глобальной переменной.
У меня есть минимальный рабочий пример с двумя файлами.
// === robot.js ===
import { BCAbstractRobot } from 'battlecode';
import Test from './test.js';
class MyRobot extends BCAbstractRobot {
constructor() {
super();
this.log("asdf"); // the log function does work
// Test.setConsoleLog(this.log); // way 1
// console.log = this.log; // way 2
}
turn() {
Test.testFunction("hello");
return this.move(0, 1);
}
}
// === test.js ===
let consoleLog = undefined;
function setConsoleLog(c) {
consoleLog = c;
}
function testFunction(s) {
// consoleLog(s); // way 1
// console.log(s); // way 2
}
export default { testFunction, consoleLog, setConsoleLog };
Поскольку Battlecode предоставляет вам функцию log, вы не можете использовать console.log по соображениям безопасности Однако я хочу иметь возможность войти из любого файла. Функция log является свойством класса MyRobot, но я хочу иметь возможность доступа к функции из других файлов и функций без передачи параметров каждый раз.
Я пробовал пару способов. Сначала я попытался создать экспорт из файла утилит (test.js), который начинался бы как неопределенный, а затем устанавливался setConsoleLog. Однако, когда я пытаюсь использовать consoleLog, он все еще не определен.
Я также попытался перезаписать ссылку на console.log, но это работает только в одном файле, а ссылка все еще на console.log в других файлах.
Каков рекомендуемый способ создания глобальной ссылки или импорта в this.log, чтобы любой файл мог импортировать его и получать к нему доступ?
Бот запускается внутри узла vm, но, насколько я знаю, с пакетом.