Подтвердить что ты не робот

Resharper, Javascript: "Использование неявно объявленной глобальной переменной" X "

Я использую Resharper 6 и ASP.NET Web Methods и имею раздражающее предупреждение в своих файлах Javascript:

"Use of implicitly declared global variable 'X'"

Причина в том, что веб-метод создается в Javascript как:

new X.example().webMethod(arg1, arg2, successCallback, failureCallback);

И X... неявно определяется. Мне интересно, есть ли решение для явного определения этого? Он определен в некотором автогенерированном JS файле, создаваемом файловой структурой веб-метода ASP.NET.

Мой вопрос: как я могу избавиться от ошибки для этой ситуации, не избавившись от нее для законно неправильных ситуаций?

Спасибо!

4b9b3361

Ответ 1

При использовании символов (функций, констант, глобальных переменных), определенных в других файлах JavaScript, я передаю их текущему файлу "функция определения области обзора" (функция верхнего уровня, обычно анонимная, которая предотвращает глобальное загрязнение пространства имен) в качестве параметров:

multiple containers

Как вы можете видеть на скриншоте, ReSharper (6.0.2202.688) рад jQuery, ContainerA и ContainerB, хотя они не определены нигде в текущем файле. Комментарий в строке 1 есть только для JSLint (без ошибок).

Этот метод предполагает, что все другие файлы JavaScript следуют наилучшей практике для минимального загрязнения глобального пространства имен JavaScript, определяя один объект верхнего уровня, который содержит все экспортированные (общедоступные) символы (т.е. jQuery является единственным глобальным объектом для библиотеки jQuery и ее плагинов ContainerA является единственным глобальным объектом LibraryA, ContainerB является единственным глобальным объектом для LibraryB и т.д.).

Поскольку вы явно не контролируете ASP.NET Web Methods, генерируя функции конструктора в глобальное пространство имен, в вашем случае вам нужно прибегнуть к конечной емкости, window:

window as a container

Это небольшое изменение в методе, предложенном @sethobrien в его комментарии. Важным (IMHO) преимуществом является то, что вы не жестко кодируете window.X в свой код. Вместо этого ваш код создает экземпляры классов из контейнера aspNet (который в настоящий момент является синонимом window, но это может измениться в будущем). Кроме того, наличие aspNet.X в коде объявляет ваше намерение более четко для людей, которые прочтут ваш код в будущем. Наконец, локальные переменные могут быть сокращены с помощью минимизаторов JavaScript, что дает немного меньший файл, передаваемый клиентским браузерам.

Ответ 2

Получается точно такая же проблема после переноса Жасмина на внешний пакет Bower и исключая код Жасмина из проекта VS. Resharper немедленно начал жаловаться на Use of an implicitly declared global variable 'describe' и т.д.

Я решил это, добавив в проект еще один файл с именем workaround.js для определения переменных. В вашем случае это будет:

// This is a workaround for R# complaining on undefined global variables.
// In practice they come from and are defined by external frameworks, so 
// this is not a real issue.

var X = function () { };

И это файл в моем проекте - https://gist.github.com/barahilia/62871d9219cee825d82e.

Ответ 3

Добавление следующего в начало вашего файла script ///<refernce path="my.js" /> (my.js - это файл, где определено X) скорее всего исправит это предупреждение, так как ReSharper начнет видеть эту глобальную переменную.

В противном случае для минимизации изменений вы можете добавить var X = window.X; в верхней части файла. Попробуйте сделать это не для того, чтобы использовать глобальное пространство имен и убедиться, что он не будет путать код, который фактически создает X в окне.