Перерахуйте всі глобальні змінні js, які використовуються сайтом (не всі визначені!)

Яким чином можна перерахувати всі глобальні змінні, які використовувалися сайтом? Чи може це зробити будь-який відладчик браузера JavaScript? Під використовуваним я маю на увазі READ, не змінений/доданий. Виявляти iframe, теж було б добре.

БУДЬ ЛАСКА, ЗАПИШИ: Мені потрібно отримати список глобальних змінних, до яких доторкнувся сайт. Не всі з них або додані, або відредаговані, ті, які використовувалися де-небудь у скриптах сайту.

41
@ C5H8NNaO4 Дякуємо. Це може бути ідея, треба перевірити це. Можливо, у вас буде вільний час у вихідні.
додано Автор Flash Thunder, джерело
Мені довелося відмовитися від змін, які хтось зробив, тому що він змінив питання. Доторкнутесь не означає, що він змінений. Це означає, що використовується в будь-якому місці сайту. Використовуйте = читання або запис.
додано Автор Flash Thunder, джерело
Не дублікат ...; Код аналіз може бути дуже dificult і не 100% впевнені.
додано Автор Flash Thunder, джерело
Інтерактивним способом "пошуку" було б відкриття devtools (наприклад, у chrome), ввівши вікно + Enter, а потім клацніть трикутник, щоб розгорнути дерево об'єктів.
додано Автор ccpizza, джерело
@Alnitak: Ох ... ммх. Тоді може бути щось подібне до тесту на покриття коду, яке повинно бути виконане з особливим урахуванням глобальних змінних.
додано Автор Felix Kling, джерело
@FelixKling звучить так, ніби хоче, щоб використовувалися , а не створені
додано Автор Alnitak, джерело
@FlashThunder Ви можете подивитися це питання
додано Автор C5H8NNaO4, джерело
@DanDascalescu Мої вибачення вам теж, ви були праві.
додано Автор C5H8NNaO4, джерело
@FlashThunder Це було моє погане. Вибачте за турботу, спасибі за відхилення змін :)
додано Автор C5H8NNaO4, джерело
@DanDascalescu Це не зовсім дублікат. Оскільки відповідь про те, як отримати всі глобальні члени, у порівнянні з усіма глобальними членами, які були визначені/модифіковані сторінкою, зовсім трохи відрізняється, оскільки остання включає деякі додаткові кроки.
додано Автор C5H8NNaO4, джерело
@ C5H8NNaO4: ОП згадано "READ, не змінено".
додано Автор Dan Dascalescu, джерело

7 Відповіді

У Chrome перейдіть до інструментів Dev і відкрийте консоль. Потім введіть таке:

Object.keys( window );

Це дасть вам масив всіх глобальних змінних.

EDIT

Після пошуку в Google трохи, я знайшов спосіб. Вам знадобиться Firefox і jslinter аддон.

Once setup, open jslinter and go to Options->check everything on the left column except "tolerate unused parameters".

Потім запустіть jslinter на веб-сторінці та прокрутіть вниз результати. У вас буде список невикористаних змінних (глобальних, а потім локальних для кожної функції).

Тепер запустіть Object.keys (window); у консолі та порівняйте результати з обох, щоб визначити, які з них використовуються.

65
додано
@DanDascalescu, але він хоче змінних, які використовуються/читати, object.keys (вікно) буде список невикористаних/непрочитаних.
додано Автор stackErr, джерело
@FlashThunder Відредаговано
додано Автор stackErr, джерело
Це не відповідь на моє запитання. У ньому перераховані всі глобальні змінні, і я хочу перерахувати лише одну, до якої торкнувся сайт.
додано Автор Flash Thunder, джерело
@FlashThunder: так, ви отримуєте 6 додаткових властивостей, які ви можете відфільтрувати: "top", "window", "location", "external", "chrome", "document" в Chrome. Спробуйте запустити Object.keys (вікно); у консолі прямо на цій сторінці.
додано Автор Dan Dascalescu, джерело

Ви можете спробувати скористатися геттерами, які ви створюєте для всіх існуючих глобальних змінних. Запустіть це перед запуском сторінки:

Object.keys(window)//or
Object.getOwnPropertyNames(window).concat(
  Object.getOwnPropertyNames(Object.getPrototypeOf(window))
)//or whatever
.forEach(function(name) {
    var d = Object.getOwnPropertyDescriptor(window, name),
        def = Object.defineProperty,
        log = console.log.bind(console);
    if (d && !d.configurable)
        return log("cannot detect accessing of "+name);
    def(window, name, {
        configurable: true,
        get: function() {
            log("window."+name+" was used by this page!");
            if (d) {
                def(window, name, d);
                return d.get ? d.get() : d.value;
            } else {//it was not an own property
                delete window[name];
                return window[name];
            }
        },
        set: function(x) {
            log("Ugh, they're overwriting window."+name+"! Something's gonna crash.");
        }
    });
});

Звичайно дескриптори властивості і т.д. не сумісні зі старими браузерами. І зауважте, що існують деякі властивості глобальних змінних/вікна , які не можуть бути програмно списку (наприклад, на * обробників), якщо вам потрібні, вам доведеться чітко вказати їх у масив. Див. Відповідні питання Перерахуйте всі властивості об'єкта вікна? і Відображати імена JavaScript JavaScript у переглядачі для цього.

Проте, я вважаю, що більш корисним є запуск інструменту покриття коду, який б'є про недекларовані глобальні змінні, як і @stackErro.

7
додано

Оскільки це питання є першим у Google під час пошуку способу, як перерахувати глобальні змінні javascript, я додаду свою власну відповідь на це. Іноді вам потрібно перерахувати глобальні змінні, щоб побачити, чи не має ваш код змінну, що просочилася за межі області (визначена без 'var'). Для цього використовуйте це в консолі налагодження:

(function ()
{
   var keys=Object.keys( window );
   for (var i in keys)
   {
      if (typeof window[keys[i]] != 'function')
      console.log(keys[i], window[keys[i]]);
   }
})();

У ньому будуть перераховані стандартні глобальні змінні, такі як вікно, документ, місце розташування тощо. Таким чином, ви можете легко знайти ваші витікні вари у списку.

6
додано
Це ще не є відповіддю на моє запитання ... Я запитував про подію читання , а не подію запису ... Мені потрібно перерахувати всі змінні, які використовувалися сторонами. .. наприклад, якщо сайт читає windows.navigator.userAgent .
додано Автор Flash Thunder, джерело

Що я і зробив. Я знайшов сторінку з якомога меншою кількістю JavaScript/Frameworks, записавши всі їх ключі в масив. Потім повторювали всі ключі на новій сторінці і реєстрували тільки ті, які не були перераховані в попередньому сайті. Можна спробувати або використовувати фрагмент коду

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

var ks = ["postMessage","blur","focus","close","frames","self","window","parent","opener","top","length","closed","location","document","origin","name","history","locationbar","menubar","personalbar","scrollbars","statusbar","toolbar","status","frameElement","navigator","customElements","external","screen","innerWidth","innerHeight","scrollX","pageXOffset","scrollY","pageYOffset","screenX","screenY","outerWidth","outerHeight","devicePixelRatio","clientInformation","screenLeft","screenTop","defaultStatus","defaultstatus","styleMedia","onanimationend","onanimationiteration","onanimationstart","onsearch","ontransitionend","onwebkitanimationend","onwebkitanimationiteration","onwebkitanimationstart","onwebkittransitionend","isSecureContext","onabort","onblur","oncancel","oncanplay","oncanplaythrough","onchange","onclick","onclose","oncontextmenu","oncuechange","ondblclick","ondrag","ondragend","ondragenter","ondragleave","ondragover","ondragstart","ondrop","ondurationchange","onemptied","onended","onerror","onfocus","oninput","oninvalid","onkeydown","onkeypress","onkeyup","onload","onloadeddata","onloadedmetadata","onloadstart","onmousedown","onmouseenter","onmouseleave","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel","onpause","onplay","onplaying","onprogress","onratechange","onreset","onresize","onscroll","onseeked","onseeking","onselect","onstalled","onsubmit","onsuspend","ontimeupdate","ontoggle","onvolumechange","onwaiting","onwheel","onauxclick","ongotpointercapture","onlostpointercapture","onpointerdown","onpointermove","onpointerup","onpointercancel","onpointerover","onpointerout","onpointerenter","onpointerleave","onafterprint","onbeforeprint","onbeforeunload","onhashchange","onlanguagechange","onmessage","onmessageerror","onoffline","ononline","onpagehide","onpageshow","onpopstate","onrejectionhandled","onstorage","onunhandledrejection","onunload","performance","stop","open","alert","confirm","prompt","print","requestAnimationFrame","cancelAnimationFrame","requestIdleCallback","cancelIdleCallback","captureEvents","releaseEvents","getComputedStyle","matchMedia","moveTo","moveBy","resizeTo","resizeBy","getSelection","find","webkitRequestAnimationFrame","webkitCancelAnimationFrame","fetch","btoa","atob","setTimeout","clearTimeout","setInterval","clearInterval","createImageBitmap","scroll","scrollTo","scrollBy","onappinstalled","onbeforeinstallprompt","crypto","ondevicemotion","ondeviceorientation","ondeviceorientationabsolute","indexedDB","webkitStorageInfo","sessionStorage","localStorage","chrome","visualViewport","speechSynthesis","webkitRequestFileSystem","webkitResolveLocalFileSystemURL","addEventListener", "removeEventListener", "openDatabase", "dispatchEvent"]
var newKs = []
for (key in window) {
    if(ks.indexOf(key) == -1 && key !== "ks" && key !=="newKs") {
        newKs.push(key);
    }
}
console.log(newKs);
</div> </div>
3
додано

Простий спосіб перерахувати свої глобалі, які я іноді використовую. Спочатку помістіть цей код якомога раніше, перш ніж будь-який з ваших сценаріїв буде виконано.

var WINDOW_PROPS = Object.keys(window);

Тоді в момент, коли потрібно відкрити свої глобальні простори, зробіть щось на зразок цього:

var GLOBALS = Object.keys(window)
   //filter the props which your code did not declare
    .filter(prop => WINDOW_PROPS.indexOf(prop) < 0)
   //prettify output a bit :) It's up to you...
    .map(prop => `${typeof window[prop]} ${prop} ${window[prop]}`)
   //sort by types and names to find easier what you need
    .sort();

console.log(GLOBALS.join("\n"));

Я використав деякі функції ES6 тут, щоб скоротити код. Це ще не добре для виробництва, але достатньо хороше для цілей налагодження і має працювати в сучасних браузерах.

1
додано

Скопіюйте та вставте наступний код у консоль JavaScript

var keys = Object.getOwnPropertyNames( window ),
    value;

for( var i = 0; i < keys.length; ++i ) {
    value = window[ keys[ i ] ];
    console.log( value );
}

всі кредити для RightSaidFred ( Javascript - скидання всіх глобальних змінних )

Я сподіваюся, що допомогла вам

1
додано
Це не відповідь на моє запитання.
додано Автор Flash Thunder, джерело
Ваша відповідь вражаюча, але я додаю console.info для кращого читання
додано Автор AmerllicA, джерело
gooodd, ця допомога!
додано Автор Diogo Cid, джерело

Ви можете спробувати використовувати JetBrains PhpStorm це те, що я роблю, ви можете отримати випробування 30 днів безкоштовно для будь-якої системи. Тоді ви перевіряєте на JSLint або JSHint або обидва я не можу пам'ятати, а потім всі ваші невикористані змінні підкреслені, виділені з різним кольором (відповідно до теми) і видимі на смузі прокрутки, і коли ви наводите на них, він говорить невикористану змінну;

EDIT: Я думаю, що версія спільноти зараз безкоштовна.

0
додано
Я думаю, ви маєте рацію @DanDascalescu, але я також думаю, що це єдиний спосіб перевірити, які змінні використовуються. так що я не буду видаляти цю відповідь.
додано Автор Prozi, джерело
Я дійсно вважаю, що це більш корисно, ніж копати те, що було додано на сторінці вікна. Маючи інструмент, який говорить вам точно, що ніколи не використовувався, добре, виглядає трохи краще для мене.
додано Автор Korcholis, джерело
Операційна група запитувала про глобальні змінні, доступні через консоль браузера, а не безпосередньо через аналіз вихідного коду, що і робить WebStorm.
додано Автор Dan Dascalescu, джерело
ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram