Решарпер, Javascript: «Использование неявно объявленной глобальной переменной« X »» - PullRequest
45 голосов
/ 30 сентября 2011

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

"Use of implicitly declared global variable 'X'"

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

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

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

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

Спасибо!

Ответы [ 4 ]

41 голосов
/ 15 ноября 2011

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

multiple containers

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

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

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

window as a container

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

7 голосов
/ 09 сентября 2014

У меня точно такая же проблема после перемещения Jasmine во внешний пакет Bower и исключения кода Jasmine из проекта VS.Решарпер сразу же начал жаловаться на 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.

5 голосов
/ 17 ноября 2011

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

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

1 голос
/ 18 июля 2018

Если это ошибка, которую можно игнорировать, вы можете использовать

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