Найти определение функции JavaScript в Chrome

Инструменты разработчика Chrome хороши, но одной вещи, которой у них, похоже, нет (я смог найти), является способ найти определение функции JavaScript. Это было бы очень удобно для меня, потому что я работаю над сайтом, который включает множество внешних файлов JS. Конечно, grep решает эту проблему, но в браузере было бы намного лучше. Я имею в виду, что браузер должен это знать, так почему бы не раскрыть это? Я ожидал что-то вроде:

  • Выберите «Проверить элемент» на странице, которая выделит строку на вкладке «Элементы».
  • Щелкните строку правой кнопкой мыши и выберите «Перейти к определению функции».
  • Правильный сценарий загружается во вкладку Сценарии, и он переходит к определению функции.

Во-первых, существует ли эта функция, и мне ее просто не хватает?

А если этого не произойдет, я предполагаю, что это будет из WebKit, но я не смог найти ничего для Запросы функций инструмента разработчика или Bugzilla от WebKit.


person Ryan DuVal    schedule 22.03.2012    source источник
comment
На вкладке «Сценарии» есть панель поиска, которая ищет текущий файл, и вы можете просмотреть содержимое функции, распечатав его. Но теперь мне любопытно, есть ли способ выполнить более общий поиск, как вы хотите ...   -  person hugomg    schedule 22.03.2012
comment
С помощью инструментов разработчика Google Chrome в правом окне «Источники» - ›у вас есть возможность установить точки останова по событию.   -  person    schedule 18.11.2012
comment
В моем случае у меня была переменная, установленная на неизвестную функцию. Я выполнил myvar.toString (), и он напечатал: function Object () {[собственный код]}, и это все, что мне нужно было знать.   -  person Ring    schedule 11.08.2015


Ответы (11)


Допустим, мы ищем функцию с именем foo:

  1. (откройте инструменты разработчика Chrome),
  2. Windows: ctrl + shift + F или macOS: cmd + optn + F. Это открывает окно для поиска по всем скриптам.
  3. установите флажок "Регулярное выражение",
  4. поиск по запросу foo\s*=\s*function (поиск по запросу foo = function с любым количеством пробелов между этими тремя токенами),
  5. нажмите на возвращенный результат.

Другой вариант определения функции - function\s*foo\s*\( для function foo( с любым количеством пробелов между этими тремя токенами.

person plesiv    schedule 06.06.2012
comment
Вот о чем я говорю! Я понятия не имел, что эта панель вообще существует - а как бы вы? - person Ryan DuVal; 19.06.2012
comment
Отличный ответ - не удалось найти этот поиск ни в одном из меню - похоже на скрытую функцию? - person Steve Chambers; 29.11.2013
comment
Это только один способ определить функцию с именем foo. Есть и другие. Что, если наша функция, например, bar['foo']? (Насколько я знаю, на этот вопрос нет хорошего ответа - он, по сути, не пишет запутанный код) - person Steven Lu; 18.01.2014
comment
добавьте ярлык OS X в ответ или явно укажите, для какой платформы предназначена ctrl-shift-f - person anddam; 11.07.2014
comment
@anddam Вы можете предложить исправление, напрямую изменив ответ. - person plesiv; 14.07.2014
comment
@zplesivcak Я не знаю, к каким платформам применяется ‹kbd› ctrl ‹/kbd› + ‹kbd› shift ‹/kbd› + ‹kbd› F ‹/kbd› - person anddam; 14.07.2014
comment
отличный ответ, как мне выучить что-то подобное - т.е. где руководство? - person Aaron Anodide; 16.07.2014
comment
Мне не удалось найти определение функции по выбранному ответу. Я искал в Google и не нашел никакой помощи. (Используется версия Chrome 41.0.2272.118 м) - person Web_Developer; 13.04.2015
comment
Это здорово! - person racl101; 16.10.2015
comment
И тогда вы не можете найти объявления функций, динамически генерируемые выражения функций и анонимные (безымянные) функции. Я бы предпочел что-то вроде Firefox: щелкните ссылку на функцию на панели часов - ›Перейти к ссылке на функцию. - person Fagner Brack; 04.11.2015
comment
Было бы неплохо, если бы вы могли нажать Ctrl + щелчок, и он перенесет вас туда. - person SuperUberDuper; 06.11.2015
comment
В Chrome 46.0.2490.86 m под Windows 10 мне пришлось дважды экранировать специальные символы в регулярном выражении, например, foo\\s*=\\s*function - person Fuhrmanator; 15.11.2015
comment
@FagnerBrack Нет идеального решения, о котором я знаю, и Chrome теперь тоже имеет такую ​​функциональность, но ссылка должна существовать в области видимости, когда вы ищете ее, чтобы этот трюк сработал. Я думаю, что это регулярное выражение обрабатывает упомянутые вами ситуации (кроме анонимных функций, которые ... я имею в виду, просто найдите функцию, если хотите их увидеть): ^(?=.*foo)(?=.*function).*$ Кроме того, приведенный выше ответ технически является идеальным ответом на вопрос с некоторым бонусом информация добавлена. - person Jason Newell; 03.06.2016
comment
Обратите внимание, что в приведенном выше регулярном выражении не будут найдены стрелочные функции, назначенные переменной типа var foo = () => (...), но это должно быть довольно редко. @StevenLu Это педантично, но я считаю, что функция не названа foo во втором примере. Он назначен свойству foo на панели. - person Jason Newell; 04.06.2016
comment
Это не работает, поскольку функция либо не определена таким образом, либо не появляется в поиске, поскольку простой поиск имени функции показывает только 1/1 результат, который находится только в теге HTML при вызове клика (независимо от того, где и как Ищу из). Я не уверен, как найти определение этой функции, не просматривая каждый включенный файл .js, который, как я думал, уже был включен в этот вид поиска. - person Davicus; 18.10.2017
comment
Ответ кажется устаревшим, ничего не произойдет, если я нажму эту комбинацию клавиш в консоли разработчика. - person Black; 26.05.2018
comment
Правильный @Black, ничего не происходит, это старый ответ, и Chrome пошел дальше. - person Vivek Shukla; 12.03.2020
comment
Повторите устаревшие комментарии выше: я использую последнюю версию Chromium, и CTRL + SHIFT + F все еще работает - person Spikatrix; 23.07.2020
comment
Вы спасли мои будущие годы неэффективного поиска - person Jovylle Bermudez; 24.06.2021

Этот приземлился в Chrome 26 августа 2012 г. Не уверен в точной версии, Я заметил это в Chrome 24.

Скриншот стоит миллиона слов:

«Инструменты

Я проверяю объект с помощью методов в консоли. При нажатии на «Показать определение функции» я попадаю в то место в исходном коде, где определена функция. Или я могу просто навести курсор на слово function () {, чтобы увидеть тело функции во всплывающей подсказке. Вы можете легко проверить всю цепочку прототипов таким образом! CDT определенно рок !!!

Надеюсь, вы все сочтете это полезным!

person Dmitry Pashkevich    schedule 16.01.2013
comment
Есть ли ярлык или функция, которая позволяет искать по ссылке на функцию? например ›inspect (document.body). А пока мне нужно d ›tmp = {a: myFunc}; ›Tmp, за которым следует определение функции Show - person Dennis C; 24.04.2013
comment
Я думаю, ты справишься dir(myFunc) - person Dmitry Pashkevich; 24.04.2013
comment
dir (myFunc) намного лучше, но по-прежнему нужны два щелчка и мышь - person Dennis C; 24.04.2013
comment
О, вы имеете в виду, можете ли вы сделать это полностью с клавиатуры? Что-то вроде findDefinition(myFunc)? AFAIK, которого еще не существует ... - person Dmitry Pashkevich; 24.04.2013
comment
Если у вас нет объекта, содержащего функцию, вы можете создать вокруг него объект, и он все равно будет работать. Например. в консоли введите: ({1:somefunction}), затем щелкните правой кнопкой мыши функцию внутри печатаемого объекта. - person Protector one; 05.07.2013
comment
@Protectorone, вы можете просто ввести dir (someFunction) в консоль - person Dmitry Pashkevich; 05.07.2013
comment
@DP Да, но это просто покажет определение, а не приведет вас туда, где оно действительно определено. Последнее более полезно, потому что вы можете редактировать его вживую. - person Protector one; 06.07.2013
comment
@Protectorone нет, console.dir() всегда печатает свой аргумент как объект со свойствами, поэтому вы можете щелкнуть его правой кнопкой мыши и выбрать Показать определение функции. - person Dmitry Pashkevich; 07.07.2013
comment
В моем случае нет объекта, все, что у меня есть, это HTML: onclick=some_function(weird). Единственный результат поиска, что бы я ни пытался, показывает только тег HTML, хотя функция делает ... что-то ... и не является предварительно определенной функцией JavaScript. - person Davicus; 18.10.2017
comment
Вы должны иметь возможность проверить элемент, затем перейти к слушателям DOM на правой панели и найти там обработчик кликов. Вы также можете использовать расширение Visual Event Chrome, чтобы ускорить поиск нужного обработчика. - person Dmitry Pashkevich; 18.10.2017
comment
Как ни странно, щелчок по определению функции для меня ничего не делает. Не отвечает. - person Tyguy7; 13.01.2020
comment
Интересно, была ли эта функция собрана мусором к тому моменту, когда вы пытаетесь ее проверить? - person Dmitry Pashkevich; 14.01.2020

Вы можете распечатать функцию, оценив ее имя в консоли, например

> unknownFunc
function unknownFunc(unknown) {
    alert('unknown seems to be ' + unknown);
}

это не сработает для встроенных функций, они будут отображать только [native code] вместо исходного кода.

ИЗМЕНИТЬ: это означает, что функция была определена в текущей области.

person joar    schedule 22.03.2012
comment
У меня это не работает (даже с функциями, определенными на странице): ›toggle_search ReferenceError: toggle_search не определен - person Ryan DuVal; 22.03.2012
comment
Ааа, смотри мою правку. В противном случае вам поможет функция поиска. Chrome devtools - это не IDE, это отладчик :) - person joar; 22.03.2012
comment
Неважно, это потому, что это было в iframe. Другой вопрос, есть ли способ узнать, в каком файле определена функция? - person Ryan DuVal; 22.03.2012
comment
Я не видел ни одного. В этом вам поможет функция поиска. Если вы ищете более тесную интеграцию между Chrome и вашей IDE, попробуйте Chrome Source Maps. youtube.com/watch?v=-xJl22Kvgjg - person joar; 23.03.2012
comment
@futzlarson Когда я это делаю, исходный текст и строка печатаются справа в той же строке, что и закрывающая скобка функции. - person jla; 05.02.2014
comment
Это работает для поиска текущего активного определения функции. - person Patrick; 08.12.2014
comment
Фактически это означает, что функция была определена в пределах текущей области. - person Jonathan; 09.06.2015
comment
@Jonathan Действительно, исправлено - person joar; 10.06.2015
comment
К сожалению, это больше не работает, по крайней мере, пару месяцев назад. Вместо этого вы просто получаете очень бесполезную строку function unknownFunc(unknown) без встроенного кода. - person aroth; 29.07.2015
comment
@aroth По крайней мере, в Chrome 45 это снова работает. Я знаю, что что-то изменилось где-то между тем, как это было опубликовано, и сейчас. В конце концов, похоже, это снова работает. - person joar; 24.09.2015
comment
Это просто показывает «undefined», хотя нажатие кнопки, вызывающей функцию, приводит к чему-то из исходного кода, который я нигде не могу найти ... есть ли какой-то волшебник волшебного прицела, размахивающий своей палочкой, и как мне его найти? - person Davicus; 18.10.2017

Обновление 2016 г.: в Chrome версии 51.0.2704.103

Есть Go to member ярлык (перечислен в settings > shortcut > Text Editor). Откройте файл, содержащий вашу функцию (на панели sources DevTools), и нажмите:

ctrl + shift + O

or in OS X:

+ shift + O

Это позволяет выводить список и достигать членов текущего файла.

person arthur.sw    schedule 10.07.2016
comment
ну, похоже, это не переход к определению произвольного вызова функции, а показывает вам все имена функций в текущем файле и позволяет вам перейти к ним - что тоже отчасти полезно. - person Scott Weaver; 19.07.2016
comment
Это именно то, что я искал, функция, похожая на firefox! В firefox вы можете просто открыть инструменты разработчика, нажать Ctrl + f, и он будет искать функцию JS на всех панелях (HTML / CSS / Javascript и т. Д.). Это делает это, в отличие от функций регулярных выражений, упомянутых в других ответах. - person javaBean007; 04.11.2016
comment
@Randy, на какой версии Chrome? Какая ОС? Я использую Chrome версии 59.0.3071.115 в OS X, и она отлично работает. - person arthur.sw; 13.07.2017
comment
@ arthur.sw Извините, я не знал, что вы должны быть в источниках, чтобы это работало. Я ожидал, что это будет работать и в консоли. - person Randy; 13.07.2017
comment
Для меня хромированное меню открывается, если я нажимаю эту комбинацию клавиш в консоли разработчика. - person Black; 26.05.2018
comment
@Black Просто чтобы убедиться: 1. Сфокусируйтесь (щелкните) на исходных файлах, в которых вы хотите искать функцию, на исходной панели инструментов разработчика. 2. Это буква «О», а не цифра «0». - person arthur.sw; 26.05.2018
comment
Может ли функция перехода к члену выполнять поиск только в тех источниках, которые в настоящее время открыты на вкладке «Инструменты разработчика»? Я просто искал функцию, которую не удалось найти, но после открытия источника, в котором она определена (с помощью метода оценки, щелчка мышью ...), он смог ее найти. - person Protector one; 23.11.2020
comment
@Protectorone, да - person arthur.sw; 23.11.2020

Другой способ перейти к местоположению определения функции - это прервать работу отладчика в том месте, где вы можете получить доступ к функции, и ввести полное имя функции в консоли. Это напечатает определение функции в консоли и предоставит ссылку, которая при нажатии открывает место сценария, в котором определена функция.

person Răzvan Flavius Panda    schedule 04.12.2013

В разных браузерах это делается по-разному.

  1. Сначала откройте окно консоли, щелкнув страницу правой кнопкой мыши и выбрав «Проверить элемент» или нажав F12.

  2. В консоли введите ...

    • Fire Fox

      functionName.toSource()
      
    • Хром

      functionName
      
person Deepak Dixit    schedule 20.11.2015
comment
функция, которую я ищу, - это stop (), и она используется как onmouseover = this.stop (); когда я делаю то, что вы говорите, он возвращает: stop () {[собственный код]} Так что же теперь делать? - person Tarik; 19.12.2015
comment
functionName.toSource() также работает с последними версиями Chrome. - person Sourav Ghosh; 29.12.2015
comment
@Tarik Посмотрите онлайн-документацию для встроенного stop. - person Fund Monica's Lawsuit; 03.03.2016
comment
@QPaysTaxes Спасибо, теперь я понимаю, что когда он возвращается: stop () {[native code]} там native code означает, что это не частная функция, это внутренняя функция, и я должен поискать в Интернете документация функции. - person Tarik; 08.05.2016

в консоли Chrome:

debug(MyFunction)
MyFunction()
person Igor Krupitsky    schedule 07.12.2018
comment
Я люблю это. Примечательно: сделайте undebug(MyFunction), чтобы снова удалить точку останова (после того, как вы нашли реализацию метода) - person Andreas Dolk; 23.12.2019

Я считаю, что самый быстрый способ найти глобальную функцию - это просто:

  1. Выберите вкладку Источники.
  2. На панели Просмотр нажмите + и введите окно.
  3. Ссылки на ваши глобальные функции перечислены первыми в алфавитном порядке.
  4. Щелкните правой кнопкой мыши интересующую вас функцию.
  5. Во всплывающем меню выберите Показать определение функции.
  6. Панель исходного кода переключится на определение этой функции.
person Chris Robinson    schedule 25.12.2017

В Google Chrome с помощью инструмента Inspect element вы можете просмотреть любое определение функции Javascript.

  1. Щелкните вкладку "Источники". Затем выберите страницу индекса. Найдите функцию.

введите описание изображения здесь

  1. Выберите функцию, затем щелкните функцию правой кнопкой мыши и выберите «Оценить выделенный текст в консоли».

введите описание изображения здесь

person subhro    schedule 26.08.2019

Если вы уже выполняете отладку, вы можете навести указатель мыши на функцию, и всплывающая подсказка позволит вам перейти непосредственно к определению функции:

Подсказка к функциям отладчика Chrome / Подсказка к данным

Дополнительная информация:

person KyleMit    schedule 11.01.2020

У меня была аналогичная проблема с поиском источника метода объекта. Имя объекта было myTree, а его метод - load. Я поставил точку останова на строке, в которой был вызван метод. После перезагрузки страницы выполнение остановилось на этом этапе. Затем в консоли DevTools я ввел объект вместе с именем метода, то есть myTree.load, и нажал Enter. Определение метода было напечатано на консоли:

введите описание изображения здесь

Также, щелкнув определение правой кнопкой мыши, вы можете перейти к его определению в исходном коде:

введите описание изображения здесь

person Abdollah    schedule 05.05.2020