JavaScript: загрязнение пространства имен - PullRequest
3 голосов
/ 28 июня 2011

Я пытаюсь отправить свое дополнение на сайт Mozilla, но получаю это чертовское предупреждение:

enter image description here

Код (в mf_options.js) довольно прост (ия думаю, что проблема только между «начальным хранилищем» и «конечным хранилищем»:

// start Storage
var url = "http://mafiaafire.com";
var ios = Components.classes["@mozilla.org/network/io-service;1"]
          .getService(Components.interfaces.nsIIOService);
var ssm = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
          .getService(Components.interfaces.nsIScriptSecurityManager);
var dsm = Components.classes["@mozilla.org/dom/storagemanager;1"]
          .getService(Components.interfaces.nsIDOMStorageManager);
var uri = ios.newURI(url, "", null);
var principal = ssm.getCodebasePrincipal(uri);
var storage = dsm.getLocalStorageForPrincipal(principal, "");
// end Storage



function display_blocked_list1() {

  var list = storage.getItem('domain_list_original');
  if (list !== undefined) {

    var strSingleLineText = list.replace(new RegExp( " ", "g" ),    "<br>"  );

    var status = document.getElementById("div1");
 status.innerHTML = strSingleLineText;
   }

  var list2 = storage.getItem('domain_list_redirect');
  if (list2 !== undefined) {

    // Strip out all line breaks.
    var strSingleLineText2 = list2.replace(new RegExp( " ", "g" ),  "<br>"  );

    var status2 = document.getElementById("div2");
 status2.innerHTML = strSingleLineText2;
   }


  var list3 = storage.getItem('list_expiry_date');

  if (list3 !== undefined) {



var dateArray = list3.split(",");
var future_date = new Date(dateArray[0],dateArray[1],dateArray[2]);
future_date.setDate(future_date.getDate()+2);

    var status2 = document.getElementById("div3");
 status2.innerHTML = future_date;

  }
// ##################################################

}

Ответы [ 3 ]

3 голосов
/ 28 июня 2011

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

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

(function() {
    // your code here
}());

Если вам нужна глобальная переменная, потому что вам нужно вызывать функцию из элементов XUL, убедитесь, что у вас есть только one . Создайте его внутри вызова функции выше с помощью

window.YourPluginNamespace = {
    // all functions or "subspaces" here
};
2 голосов
/ 28 июня 2011

Оберните ваш код в конверт функции, чтобы ваши var s были локальными по отношению к этому телу функции, и явно прикрепите все, что вы хотите, к глобальному объекту.

(function (global) {

  // your code here

  global.myGlobalVar = myVar

}(this));
0 голосов
/ 28 июня 2011

Проблема в том, что вы используете слишком много глобальных переменных, определенных за пределами функции.

Представьте себе такой сценарий: мой аддон, Foo , использует переменную с именем sheep.

var sheep = 10;

Ваш аддон, Бар , использует переменную, также называемую sheep:

var sheep = 20;

Когда я обращаюсь к sheep, какЯ уверен, что твой аддон не изменил его?По той же причине аддоны используют анонимные функции foo = function() {, потому что они локальные.

Чтобы сделать глобальные переменные более локальными, оберните ваш весь скрипт в анонимную функцию:

(function() {
  var sheep = 10;
}());

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

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