2015-04-30 2 views
21

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

<script id="someJS"> 

    var boom = 'boom'; 

    function example(){ 

     alert(boom); 
    } 

</script> 

, а затем сделать:

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

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

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


Update: Для тех, кто хотел бы знать, дело пользователя для этого:

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

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

DynamicJS = { 

    boom: 'boom', 

    example: function(message) { 

     alert(message); 

    } 

} 

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

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

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

+6

_ «Я не хочу нулевать фактическую функцию, так как я не всегда знаю, что находится внутри JS-файла». _ Что именно вы подразумеваете под этим? – Cerbrus

+0

Как в 'example = null'; – Cameron

+1

Почему вы хотите удалить функцию в любом случае? Каков негативный аспект его наличия? –

ответ

36

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

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

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

+3

Это, вероятно, самый подходящий ответ здесь, особенно имеющий отношение к запросу OP: * если вы не знаете, что сделал код, вы не можете его отменить *. – CodingIntrigue

+0

@RGraham Или в коротком предложении: * Вы не можете запустить то, что уже было *. –

16

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

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

window.example = null; 

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

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

window.example = function(){}; 

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

6

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

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

window['example'] = null; 

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

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

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

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

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

_exampleBackup(); 

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

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

По-видимому, [это точно, что OP не хочет] (http://stackoverflow.com/questions/29970467/removed-javascript-is-still-executable#comment48060679_29970467). (По какой-то причине ...) – Cerbrus

+0

@Cerbrus whoah, полностью пропустил этот последний комментарий! Просто обновил свой ответ на адрес - большое спасибо за указание на это ... total \ * facepalm \ * moment = P – newfurniturey

+0

Должно быть понято, что «как только функция была обработана» относится к тегу '

1

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

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

0

JavaScript Hoisting

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

подходы, чтобы сделать этот

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

Смежные вопросы