Поиск по этому блогу

четверг, 19 апреля 2012 г.

JavaScript и чистота globals

Кто сидел на моем стуле, кто ел из моей тарелки, кто срал в мой globals ?
Для безопасности вашего кода (переменных) не стоит оставлять их в глобальном массиве. Это связанно с возможностью совпадения имен и перекрытия чужих переменных или Ваших чужим кодом.
Конечно все это чудесно и мы могли бы беседовать на темы "А зачем ?", "А почему ?", но если Вы решили проверить свой код на случай не оставляет ли он на странице чего лишнего давайте смотреть дальше...


Предлагаю следующий код :
  // Необходимо вставить до подключения других скриптов 
  var globalsChecker = {
    getVars : function (w) {
      var values = {}, i;
      for (i in w) {
        values[i] = null;
      }

      return values;
    },
    initVars : {},
    check : function (w) {
      var currVars = this.getVars(w),
          diff = {added : [], removed : []},
          i;
    
      for (i in this.initVars) {
        if ( this.initVars.hasOwnProperty(i) && !currVars.hasOwnProperty(i)) {
          diff.removed.push(i);
        }
      }
    
      for (i in currVars) {
        if ( !this.initVars.hasOwnProperty(i) && currVars.hasOwnProperty(i)) {
          diff.added.push(i);
        }
      }
  
      return diff;
    }
  }

  globalsChecker.initVars = globalsChecker.getVars(window);


  // Вставить после скриптов или выполнять с консоли.
  console.dir(globalsChecker.check(window))
Что же мы делаем и зачем ?
В начале определяется объект который умеет доставать параметры с переданного объекта (getVars), хранить их в переменной initVars, и сравнивать их с параметрами из "другого" состаревшегося объекта (check). Метод check покажет вам какие переменные были добавлены, а какие удалены.
Хочу обратить внимание на 3 аспекта :
  1. Проверка не привязана к объекту window , что значит - Вы сможете проверять любой объкт таким способом.
  2. Метод getVars не проводит проверки на hasOwnProperty что позволит более "глубоко" оценивать изменения.
  3. Сам объект globalsChecker написан без шаблонов сокрытия данных и тому подобного - когда можно закрыть от пользователя переменную в замыкании (что было бы кстати для initVars) только из расчета лени самопроверки, а не принудительного использования.

Комментариев нет:

Отправить комментарий