Измените javascript, чтобы открыть переменную области действия функции.

Я хотел бы иметь возможность отображать переменную с функциональной областью, которая является частью javascript веб-сайта (не моего).

Вот упрощенный пример:

function addHooks(e, t, n, i) {
    var props = {                    // Would like to expose this
        update: function() { ... },
        remove: function() { ... },
        find: function() { ... },
    };
    ...
}

В приведенном выше примере я хотел бы открыть переменную props, чтобы мой webextension мог затем получить к ней доступ для изменения поведения веб-сайта. Обратите внимание, что веб-сайт, который обслуживает этот файл JS, не находится под моим контролем, и поэтому я не могу просто изменить исходный файл для экспорта этой переменной. Тем не менее, я полностью готов изменить окончательный код, который запускает браузер (я просто не знаю, как это сделать). Файл javascript, содержащий функцию addHooks, кажется, добавляется динамически через XHR.

Хотя я понятия не имею, как это сделать программно, мне удалось установить точку останова, а затем выдать window.siteController = props в консоли разработчика браузера. К сожалению, ручное вмешательство пользователя — это не то, что я могу упаковать и распространять.

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

Существует ли канонический программный способ раскрытия переменной в области действия функции?


person Guru Prasad    schedule 15.12.2016    source источник
comment
Исходный код javascript не принадлежит мне, и поэтому я не могу изменить его на уровне исходного кода.   -  person Guru Prasad    schedule 15.12.2016
comment
вы не можете получить доступ к переменной за пределами ее области...   -  person Punit    schedule 15.12.2016
comment
тогда невозможно получить доступ к этому свойству, проверьте, есть ли какая-либо функция для доступа к этому свойству за пределами   -  person Azad    schedule 15.12.2016
comment
Итак, ваш вопрос: могу ли я изменить поведение функции, не меняя ее. Нет.   -  person    schedule 15.12.2016
comment
Это не должно быть возможным, и кажется таковым, если вы посмотрите вокруг на эту тему. Однако кто-то предоставил какое-то хакерское решение, которое может вас заинтересовать: stackoverflow.com/a/25473571/3132718   -  person Al.G.    schedule 15.12.2016
comment
@GuruPrasad, вы пишете расширение. На самом деле изменение кода веб-сайта возможна.   -  person Makyen♦    schedule 15.12.2016
comment
@torazaburo: я не вижу, где я упоминал, что функцию нельзя изменять. Я просто не знаю, как изменить функцию   -  person Guru Prasad    schedule 15.12.2016
comment
@GuruPrasad в своем первом комментарии вы сказали, что не можете изменить исходный код. Но проще всего было бы просто return props;   -  person Al.G.    schedule 15.12.2016
comment
Что вы ищете в ответ здесь? Похоже, вы уже понимаете, что вам нужно изменить код, чтобы открыть переменную. Вы просто ищете кого-то, кто скажет «Да, вам нужно изменить код»? Вы ищете кого-то, чтобы сказать вам, как это сделать? Если это так, нам нужно немного больше информации (полный минимальный воспроизводимый пример) . То, как вы сформулировали этот вопрос, звучит так, как будто вы отвергаете возможность изменения кода, запрашивая другой способ предоставления переменной. Канонический способ раскрыть переменную — изменить код.   -  person Makyen♦    schedule 15.12.2016
comment
Я недостаточно знаю JS, чтобы знать, достижимо ли то, что я хочу, и как этого добиться. Я полностью открыт для изменения исходного кода. Однако, как предполагают некоторые люди, я не могу изменить файл, так как не я его размещаю. Сказав это, я полностью открыт для изменения ответа XHR для удовлетворения моих потребностей. Я указал одно потенциально жизнеспособное решение, но я не знаю, как его реализовать. Я также не знаю, может ли это на самом деле работать. Возможно, мне следует лучше понять проблему, чтобы я мог лучше ее объяснить.   -  person Guru Prasad    schedule 15.12.2016
comment
@GuruPrasad, значительная часть проблемы с вопросом заключается в том, что у нас действительно недостаточно информации, чтобы предоставить конкретные ответы, это сработает. Что потребуется для достижения желаемого, будет зависеть от того, как обрабатывается код на странице. Это может быть что-то столь же простое, как предоставление другой версии функции, вставленной в виде скрипта страницы. Это может потребовать эффективного аннулирования запроса XHR, самостоятельного извлечения кода, его изменения и последующей вставки на страницу. Без существенных подробностей все, что мы можем ответить, это общие положения и возможности.   -  person Makyen♦    schedule 15.12.2016
comment
@GuruPrasad, кстати: если вы хотите, чтобы конкретный человек был уведомлен о вашем комментарии, вам нужно указать его идентификатор в своем комментарии с @ перед ним. Например, для меня это будет @Makyen. Если вы сделаете это первым в своем комментарии, система предложит автозаполнение предложений от тех, кто уже разместил комментарии к этому ответу/вопросу. Первоначальный постер ответа/вопроса, который вы комментируете, всегда будет уведомлен. Этот мета-пост содержит дополнительную информацию.   -  person Makyen♦    schedule 15.12.2016


Ответы (2)


если вы хотите открыть переменную объекта реквизита, вы можете вернуть весь объект из функции, например, в замыканиях. Или вы можете просто объявить включающую функцию как функцию-конструктор, установить свойства как this.props, а затем вызвать ту же функцию в другом месте, используя новое ключевое слово. Позвольте мне знать, если это помогает

person Soham Bhaumik    schedule 15.12.2016
comment
Как бы я изменил его, чтобы добиться этого? Скрипт добавляется на страницу через XHR. Как я уже говорил, исходный код скрипта не находится под моим контролем. - person Guru Prasad; 15.12.2016
comment
Тогда это возможно только в том случае, если вы можете изменить реквизиты на this.props и получить их в другой функции. - person Soham Bhaumik; 15.12.2016

РЕДАКТИРОВАТЬ: Спасибо Макиену, который указал на мою ошибку. По-видимому, вы сможете это сделать, если переопределите функцию в скрипте страницы и вставите ее как элемент скрипта. (См. комментарий для двух ссылок).

Просто убедитесь, что ваш элемент <script> вставлен после исходного определения, а затем вы можете либо return props в конце функции, либо использовать this.props и использовать функцию либо в качестве конструктора, либо с помощью функции call, передав объект, который получит свойство props добавлен.


Старый ответ ( __ неправильно __ видимо)

Краткий ответ: вы не можете.

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

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

скрипты контента не могут видеть переменные JavaScript, определенные скриптами страниц Дополнительная информация и источник

Firefox/Chrome запускает ваш код JavaScript в параллельной среде, изолированной от среды веб-сайта. Это, конечно, из соображений безопасности. Это также помогает вам иметь возможность разрабатывать, не зная точной внутренней работы каждого веб-сайта, в который может быть введен ваш код, поскольку вам не нужно беспокоиться о конфликтах имен (что было бы невозможно, если бы не разделение среды). Единственное, к чему у вас есть доступ, — это DOM, через который вы можете собирать информацию, изменять веб-сайт и даже в некоторых случаях общаться с веб-сайтом (веб-сайт также должен следовать выбранному вами протоколу).

person et_l    schedule 15.12.2016