Проблема JSLint із "вікном" як глобальною змінною


75

Тому я використовую JSLint для спроби виявлення помилок. Я вимикаю деякі параметри, які мені не подобаються, але я не бачу жодного способу, щоб дозволити можливість використовувати windowглобальну змінну. Ну, є варіант віджету Yahoo, але це надмірно.

У чому справа з використанням "вікна", чому JSLint каже, що це спричиняє помилки?


Як ви використовуєте вікно? Можливо, ви могли б зняти залежність від нього, хоча, наведені нижче рішення bjoernwibben, здається, виконують цю роботу.
Guðmundur H

Ну, я використовував його для window.setTimeout. Я знаю, що мені цього не потрібно, і, мабуть, не слід, але в деяких місцях, де я працюю з декількома вікнами у розширенні Firefox, мені потрібен буде доступ до нього. Дякую!
Бйорн,

Обов'язковий коментар JSHint . Він вирішує деякі з цих питань JSLint і є набагато гарнішим IMHO. ;)
DondeEstaMiCulo

Відповіді:


135
/*jslint browser: true*/

Це було правильним рішенням цього. Починаючи з 07.07.2017, ви повинні встановлювати глобальну директиву вручну. З документації JSLint :

Директива / * global * / використовується для зазначення набору глобалів (зазвичай функцій та об’єктів, що містять функції), доступних для цього файлу. Це зазвичай використовувалося у браузерах для зв’язування вихідних файлів між собою до появи модулів ES6. Використання глобальних змінних настійно не рекомендується, але, на жаль, веб-браузери вимагають їх використання. Директиву / * global * / можна використовувати лише тоді, коли вибрано параметр Припустити браузер.

Тож вам потрібно буде використовувати:

/*jslint browser */
/*global window */

У відповіді @bjoernwibeen сказав, що це правильне рішення на сьогодні. Зауважте, що в обох наших відповідях була різниця у два роки.
Matt Clarkson,

1
Офіційну документацію, що підтверджує це, можна знайти за адресою: jslint.com/lint.html#options Some globals can be predefined for you. Select the Assume a browser (browser) option to predefine the standard global properties that are supplied by web browsers, such as document and addEventListener. Це також включає вікно.
Koen Zomers 03.03.14

Позначив це як правильну відповідь. Потрібно було додати коментар до питання, щоб я отримав попередження, яке не було зафіксовано на 3 роки занадто пізно. : P
Bjorn

1
@BjornTipling, вибачте. Тепер я знаю, як надіслати коментар до цього питання в майбутньому!
Matt Clarkson,

@ryanpcmcquen, у посібнику JSLint все ще говориться, що це правильний спосіб зробити це. На даний момент веб-сайт jslint.com навіть ігнорує прапорець "браузер".
Matt Clarkson

76

Просто зробіть коментар у своєму сценарії так:

/*global window */

... your script goes here

Цей коментар повідомляє JSLint, що windowвизначено десь в іншому місці.

Дивіться: http://www.JSLint.com/lint.html ,

JSLint також розпізнає /* global */коментар, який може вказувати на JSLint, що змінні, використані в цьому файлі, були визначені в інших файлах. Коментар може містити список імен, розділених комами. За кожним іменем за бажанням може стояти двокрапка, або true або false, true вказує на те, що цей файл може призначати змінну, а false, що вказує на те, що присвоєння не допускається, що є типовим.

Якщо ви хочете, щоб вікно було глобальним за замовчуванням, не застосовуючи коментар до вашого сценарію, ви можете додати predef:["window"]до об’єкта літеральний параметр всередині JSLINTфункції вашого локального jslint.jsфайлу.

До речі, я також використовую predef:["$","window"]jQuery global.

Оновлення:

Ця відповідь була правильною ще в 2009 році. Наразі ви повинні використовувати рішення, /*jslint browser: true*/надане Меттом Кларксоном.


5
Незважаючи на те, що ця робота - це не "правильна" відповідь. browser: trueє.
Том Роггеро,

Як уже згадувалось у відповіді вище, відповідь Метта Кларксона зараз правильна.
надсвітлий

1
Зауважте, що між /*і не повинно бути пробілу global, або JSLint, очевидно, ігнорує декларацію.
KajMagnus

Це корисно для мене, оскільки я будую щось, що має кілька інших глобальних змін, тому дякую.
Стів

Це має бути відповідь зараз, оскільки це /*jslint browser: true*/вже не працює.
ryanpcmcquen

4

Щоб JSLint знав, що ви розпізнаєте windowяк глобальний об’єкт, додайте цю директиву у верхній частині файлу:

/*global window*/

Раніше я міг використовувати:

/*jslint browser: true */

але це, здається, вже не працює. Тепер, згідно з довідкою JSHint щодо browserопції:

Він не постачає selfабо window; вам доведеться запитувати ці псевдоніми страшного глобального об’єкта самостійно.

Я не впевнений, коли була внесена ця зміна, але це мене затримало на деякий час.


3

Мені довелося використовувати обидві наведені вище відповіді в цьому коді, щоб позбутися всіх попереджень:

/*jslint browser:true*/
/*global window*/
// eventBoiler v0.1.1 by @ryanpcmcquen
// https://github.com/ryanpcmcquen/eventBoiler
(function (win, doc) {
    'use strict';
    win.eventBoiler = function (selector, typeOfEvent, func) {
        doc.querySelector(selector).addEventListener(typeOfEvent, func);
    };
    win.eventBoiler.all = function (selectors, typeOfEvent, func) {
        Array.prototype.slice.call(doc.querySelectorAll(selectors)).map(function (i) {
            i.addEventListener(typeOfEvent, func);
        });
    };
}(window, document));

Отже, для мене це рішення при використанні веб-сайту JSLint :

/*jslint browser:true*/
/*global window*/

1

Якщо ви не хочете вказувати це в кожному файлі, ви можете встановити це глобально у своєму конфігураційному файлі eslintrc таким чином:

"globals": {
    "window": true,
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.