Google Apps Script: const против var — что выбрать?

Краткий обзор var, const и let (упоминание)

В Google Apps Script, как и в JavaScript, для объявления переменных используются var, const и let. var – устаревший способ, а const и let предоставляют более современный и предсказуемый контроль над областью видимости и изменяемостью переменных. let не рассматривается в данной статье, так как фокус сделан на сравнении var и const.

Почему выбор между const и var важен?

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

Подробное рассмотрение var в Google Apps Script

Область видимости переменной, объявленной через var (function scope)

Переменные, объявленные с помощью var, имеют function scope. Это означает, что они видны внутри функции, в которой объявлены, или глобально, если объявлены вне какой-либо функции.

function myFunction() {
  var x = 10;
  if (true) {
    var y = 20; // y доступна во всей функции myFunction
  }
  Logger.log(x); // Выведет 10
  Logger.log(y); // Выведет 20, даже если y объявлена внутри блока if
}
myFunction();

Hoisting (поднятие) переменных var

var подвержен hoisting (поднятию). Это означает, что объявление переменной перемещается вверх области видимости (функции или глобальной), но инициализация остается на месте. Поэтому до объявления переменной ей присваивается значение undefined.

function myFunction() {
  Logger.log(x); // Выведет undefined
  var x = 10;
  Logger.log(x); // Выведет 10
}
myFunction();

Возможность переопределения переменных var

Переменные, объявленные с помощью var, можно переопределять в пределах их области видимости, что может привести к нежелательным ошибкам.

function myFunction() {
  var x = 10;
  var x = 20; // Переопределение x
  Logger.log(x); // Выведет 20
}
myFunction();

Примеры использования var в Google Apps Script

var исторически использовался для объявления переменных в Google Apps Script. Например, при работе с Google Sheets API:

function updateSheet() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var cell = sheet.getRange(lastRow, 1);
  var value = cell.getValue();

  // Дальнейшая обработка данных, например, отправка email
  if (value) {
    var emailAddress = 'admin@example.com';
    MailApp.sendEmail(emailAddress, 'Обновление таблицы', 'В таблице есть новые данные.');
  }
}

Глубокий анализ const в Google Apps Script

Область видимости переменной, объявленной через const (block scope)

Переменные, объявленные с помощью const, имеют block scope. Это означает, что они видны только внутри блока кода (например, внутри цикла for или условного оператора if), в котором объявлены.

function myFunction() {
  if (true) {
    const x = 10;
  }
  // Logger.log(x); // Ошибка: x не определена, т.к. она объявлена внутри блока if
}
myFunction();

Неизменяемость значения переменной const (но не всегда!)

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

const pi = 3.14159; 
// pi = 3.14; // Ошибка: нельзя переопределить константу

const myArray = [1, 2, 3];
myArray.push(4); // Разрешено: изменяем содержимое массива
Logger.log(myArray); // Выведет [1, 2, 3, 4]

const myObject = {name: 'John', age: 30};
myObject.age = 31; // Разрешено: изменяем свойство объекта
Logger.log(myObject.age); // Выведет 31

Hoisting и временная мертвая зона (Temporal Dead Zone — TDZ) const

const также подвержен hoisting, но в отличие от var, он не инициализируется значением undefined. Попытка доступа к переменной const до ее объявления приведет к ошибке ReferenceError, поскольку она находится в Temporal Dead Zone (TDZ).

Реклама
function myFunction() {
  // Logger.log(x); // Ошибка: ReferenceError: Cannot access 'x' before initialization
  const x = 10;
  Logger.log(x); // Выведет 10
}
myFunction();

Примеры использования const в Google Apps Script

const идеально подходит для хранения конфигурационных параметров, URL-адресов API, ключей API и других значений, которые не должны изменяться в процессе выполнения скрипта. Например:

function sendCampaign() {
  const API_KEY = 'YOUR_API_KEY';
  const CAMPAIGN_ID = '12345';
  const API_URL = 'https://api.example.com/campaigns/' + CAMPAIGN_ID;

  // ... логика отправки кампании с использованием API_KEY и API_URL ...

  Logger.log('Кампания отправлена с использованием API: ' + API_URL);
}

Сравнение const и var в Google Apps Script: ключевые отличия

Область видимости: function scope против block scope

var имеет function scope, а const имеет block scope. Это одно из самых важных отличий.

Возможность переопределения: изменяемость против неизменяемости (частичной)

Переменные var можно переопределять. Значение const изменять нельзя (для примитивов) или можно изменять содержимое (для объектов и массивов), но саму переменную переопределить нельзя.

Hoisting: поведение var и const

Оба подвержены hoisting, но var инициализируется undefined, а const находится в TDZ.

Когда использовать var и когда const: рекомендации

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

var: Избегайте использования var в новом коде. Используйте let (который также имеет block scope и не позволяет переопределение без объявления) или const.

Практические примеры и рекомендации по выбору

Сценарии, когда const предпочтительнее var

Конфигурационные параметры (ключи API, URL-адреса).

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

Объекты и массивы, которые должны оставаться неизменными (хотя содержимое может меняться).

Случаи, когда использование var может быть оправдано (редко)

Практически отсутствуют. В современном JavaScript и Google Apps Script рекомендуется избегать var в пользу const и let.

Рекомендации по стилю кодирования: придерживайтесь const по умолчанию

Всегда начинайте с const. Если вам нужно изменить значение переменной, используйте let. Избегайте var.

Миграция с var на const: пошаговое руководство и предостережения

Начните с просмотра вашего кода и определения переменных, которые никогда не изменяются.

Замените var на const для этих переменных.

Протестируйте код, чтобы убедиться, что ничего не сломалось.

Для переменных, которые изменяются, используйте let.

Будьте осторожны с областями видимости: const и let имеют block scope, что может потребовать некоторой реструктуризации кода, если вы активно использовали behavior var.

Пример миграции:

Старый код:

function processData(data) {
  var result = [];
  for (var i = 0; i < data.length; i++) {
    var item = data[i];
    result.push(item * 2);
  }
  return result;
}

Новый код:

function processData(data) {
  const result = [];
  for (let i = 0; i < data.length; i++) {
    const item = data[i];
    result.push(item * 2);
  }
  return result;
}

В этом примере result объявлен как const, потому что мы не переприсваиваем result другой массив, а изменяем его содержимое. i объявлен как let, потому что значение i изменяется на каждой итерации цикла.


Добавить комментарий