Подтвердить что ты не робот

Удаленный JavaScript все еще исполняемый

Если у меня есть следующий код JavaScript:

<script id="someJS">

    var boom = 'boom';

    function example(){

        alert(boom);
    }

</script>

а затем выполните:

$('#someJS').remove();

Я все еще могу вызвать example(), хотя эта функция JavaScript больше не находится в DOM... Как ее удалить?

Я не хочу обнулять фактические функции и переменные с помощью: boom = null; example = null;, поскольку я не всегда знаю, что находится внутри файла JavaScript. Например, имена функций, переменные и т.д. Мне нужно уметь исключить энтузиазм того, что было внутри этого тега script.


Обновление: для тех, кто хотел узнать случай пользователя для этого:

В основном в приложении, над которым я работаю, у нас есть пользовательский JavaScript для определенных клиентов, который при нажатии кнопки, например. save, а затем проверяет, существуют ли определенные функции, а затем запускает их. Однако, поскольку эта кнопка сохранения является общей, это означает, что пользовательский код вызывается все время после его добавления, даже если оно больше не актуально.

Решение, с которым мы столкнулись (кто-то опубликовал это как ответ, но по какой-то причине он удалил), должен был обозначать все это как:

DynamicJS = {

    boom: 'boom',

    example: function(message) {

        alert(message);

    }

}

И тогда мы можем просто сделать: delete DyanmicJS;

Что удаляет все функции и переменные внутри этого пространства имен из глобальной области действия, эффективно вставляя то, что добавил файл script.

Хотя я уверен, что это не идеальное решение, как если бы у вас были прослушиватели событий внутри файла, я уверен, что они все равно будут существовать!

4b9b3361

Ответ 1

Как его удалить? Я не хочу игнорировать действительную функцию, поскольку я не всегда знаю, что находится внутри JS файла.

Вы не можете. Script выполняется код, создает вещи в среде JavaScript и полностью отключен от элемента script, который его загрузил. Помимо полной перезагрузки этой среды, если вы не знаете, что сделал код, вы не можете ее отменить.

Даже если вы могли бы сделать вывод о том, что сделал код (например, сделав список глобалов до и после), в то время как вы могли удалить новые глобальные переменные, которые вы обнаружили (или, по крайней мере, установили их в null или undefined, так как delete не работает с глобальными расширениями, добавленными через объявления функций или var), что не говорит вам, какие обработчики событий, веб-работники и т.д. код может подключиться.

Ответ 2

$('#someJS').remove(); удаляет только элемент script со страницы.
К моменту удаления элемента script уже был интерпретирован, что означает, что example был добавлен в глобальную область.

Чтобы правильно удалить эту функцию, вы можете сделать это:

window.example = null;

Однако, по-видимому, вы не хотите этого делать, и это приведет к загрузке ошибок, если там script в другом месте, которое фактически использует example.

Альтернативой может быть назначение пустой функции:

window.example = function(){};

Это предотвратит "удаление" из-за ошибок.
(Помимо функции, не возвращающей значения, когда это можно ожидать)

Ответ 3

Как только функция была обработана, она теперь входит в список выполняемых функций window - независимо от того, удаляете ли вы исходный источник или нет.

Чтобы полностью удалить функцию, попробуйте:

window['example'] = null;

Однако, исходя из вашего последнего комментария:

Я не хочу игнорировать действительную функцию, поскольку я не всегда знаю, что находится внутри JS файла.

Похоже, вы хотите поддерживать ссылку на функцию, но не иметь ее исполняемый файл напрямую? В этом случае вы можете сохранить ссылку на него и удалить оригинал:

var _exampleBackup = window['example'];
window['example'] = null;

Чтобы вызвать его, теперь вы можете использовать:

_exampleBackup();

И чтобы восстановить его, если вам нужно:

window['example'] = _exampleBackup;
example();

Ответ 4

Эта функция все еще находится в окне.

Код, который вы помещаете внутри тега script, будет выполняться при создании элемента и больше не имеет значения (примерно). Удаление тега не повлияет на документ и его влияние на него (как правило).

Чтобы удалить эту функцию, вам нужно удалить свойство example объекта window, каким образом будет определена функция, выполнив указанный выше код.

Ответ 5

$('#someJS').remove(); делает не что иное, как удаление text из DOM, но ничего не делает для фактической функции (или файла), поскольку она анализируется и выполняется.

Чтобы удалить функцию, вы можете либо установить ее на null, либо просто перезаписать ее с помощью example=function(){};

Ответ 6

Подъем JavaScript

В JavaScript есть концепция под названием Подъем. На этом этапе компилятор анализирует весь код JavaScript и объявляет переменные и функции в начале области. В вашем случае пример функции и переменный бум уже объявлены и сохранены в памяти. Когда вы запустите этот метод, интерпретатор вызовет этот метод и интерпретирует его вместо интерпретации фактического кода JavaScript. Вы удаляете блок script после его поступления в память. И поэтому он по-прежнему является исполняемым.

Подходы к этому

1) Использовать объектно-ориентированный подход. Добавьте свой метод в объект, и когда вы хотите его удалить, удалите это свойство, используя delete. 2) Создайте одну переменную, которая содержит функцию, которая содержит ваш код для выполнения, и установите эту переменную undefined, если хотите.