javascript: глобальная переменная утечка - PullRequest
3 голосов
/ 26 июля 2011

Всякий раз, когда я отправляю плагин в Firefox, я получаю электронное письмо с сообщением о том, что некоторые из моих переменных просачиваются в глобальную область ... как только они говорят мне, что я исправляю проблему.Но до тех пор, есть ли способ (программа?) Проверить, не попали ли переменные в глобальную область видимости?

Спасибо!

Ответы [ 5 ]

4 голосов
/ 26 июля 2011

Стандарт 5-го издания ECMAScript вводит дополнительный «строгий режим», который заставляет вас использовать более чистое подмножество JS. В строгом режиме, если вы попытаетесь присвоить переменной, которая не была объявлена ​​с ключевым словом var, будет сгенерировано ReferenceError.

Вы можете включить строгий режим внутри функции или во всем файле, включив это в качестве первого оператора:

"use strict";

Я бы порекомендовал строгий режим для вашей проблемы. Это уже реализовано в последних версиях основных браузеров. Смотрите здесь для обзора:

https://developer.mozilla.org/en/JavaScript/Strict_mode

4 голосов
/ 26 июля 2011

Обе JSLint и JSHint будут предупреждать вас, если вы пропустите var. Оба доступны на Github ( JSLint , JSHint ), и оба могут быть запущены из командной строки с использованием Node.js, Rhino или любой другой не браузерной среды по вашему выбору. Они даже могут быть интегрированы в ваш текстовый редактор / IDE по вашему выбору и запускаться нажатием клавиши.

3 голосов
/ 26 июля 2011

Инструменты, которые рекомендовали другие, - отличная идея, и они укажут вам на проблему, но если у вас есть юнит-тесты, вы можете включить в них тесты на утечку глобалов.

Просто запустите это перед загрузкой исходного кода,

var globalsBeforeLoad = {};
(function () {
  for (var k in this) { globalsBeforeLoad[k] = true; }
})()

и запустите его после загрузки кода

(function () {
  var leaked = [];
  for (var k in this) {
    if (!Object.hasOwnProperty.call(globalsBeforeLoad, k)) {
      leaked.push(k);
    }
  }
  if (leaked.length) { alert("You leaked " + leaked.join(", ")); }
})()
2 голосов
/ 26 июля 2011

Любое объявление переменной внутри функции, которая не начинается с var, попадет в глобальную область видимости.Вы можете проверить это.

1 голос
/ 26 июля 2011

Объявите все ваши переменные в верхней части каждой функции.

Наихудшей из всех плохих функций JavaScript является его зависимость от глобальных переменных. Глобальная переменная переменная, которая видна в любой области видимости. Глобальные переменные могут быть удобны в очень маленьких программах, но они быстро становятся громоздкими, когда программы становятся больше. Поскольку глобальная переменная может быть изменена любой частью Программа в любое время может существенно усложнить поведение программы. Использование глобальных переменных ухудшает надежность программ, которые их используют. [...] В большинстве языков обычно лучше объявить переменные на сайте первого использования. Это оказывается плохим попрактиковаться в JavaScript, потому что у него нет блока Лучше объявить все переменные в верхней части каждая функция.

"JavaScript: хорошие детали от Дугласа Крокфорда. Copyright 2008 Yahoo! Inc., 978-0-596-51774-8 ".

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