删除的JavaScript仍然是可执行的

时间:2015-04-30 14:29:47

标签: javascript jquery

如果我有以下JavaScript代码:

<script id="someJS">

    var boom = 'boom';

    function example(){

        alert(boom);
    }

</script>

然后执行:

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

即使JavaScript函数不再位于DOM内,我仍然可以调用example() ...如何删除它?

我不想用boom = null; example = null;取消实际的函数和变量,因为我并不总是知道JavaScript文件中的内容。例如函数名称,变量等。我需要能够删除该脚本标记内容的完整性。

更新:对于那些想要了解用户案例的人:

基本上在我正在处理的应用中,我们为某些客户添加了自定义JavaScript,当点击按钮时,例如保存,然后检查是否存在某些功能,然后运行它们。但是因为这个保存按钮是通用的,这意味着自定义代码在添加后会被调用,即使它不再相关。

我们提出的解决方案(有人发布了这个作为答案,但由于某种原因将其删除)就是将其命名为:

DynamicJS = {

    boom: 'boom',

    example: function(message) {

        alert(message);

    }

}

然后我们可以这样做:delete DyanmicJS;

从全局范围中删除此命名空间中的所有函数和变量,有效地将脚本文件添加到内容中。

虽然我确信这不是一个完美的解决方案,就像你在文件中有事件监听器一样,我确信它们仍然存在!

5 个答案:

答案 0 :(得分:36)

  

如何删除它?我不想废弃实际功能,因为我不总是知道JS文件中的内容。

你不能。脚本代码被执行,在JavaScript环境中创建,并且与加载它的script元素完全断开连接。除了完全重新加载该环境外,如果您不知道代码的作用,则无法将其撤消。

即使您可以推断出代码所做的一些事情(例如,通过制作前后的全局变量列表),您可以删除检测到的新全局变量(或者至少将它们设置为null或者undefined,因为delete无法通过函数声明或var添加全局变量,因此不会告诉您哪些事件处理程序,Web工作者等等。代码可能已经连接起来。

答案 1 :(得分:16)

$('#someJS').remove(); 从页面中删除脚本元素 删除元素时,脚本已经被解释,这意味着example已被添加到全局范围。

要正确删除该功能,您可以执行此操作:

window.example = null;

但是,显然你不想这样做,如果其他地方的脚本实际上使用example,这将导致大量错误。

另一种方法是为其分配一个空函数:

window.example = function(){};

这将阻止&#34;删除&#34;导致错误。
(除了可能预期的函数不返回值)

答案 2 :(得分:6)

一旦处理完该功能,它现在就成为window可执行功能列表的一部分 - 无论您是否删除了原始来源。

要完全删除该功能,请尝试:

window['example'] = null;

但是,根据您的上次评论:

  

我不想忽略实际功能,因为我不总是知道JS文件中的内容。

听起来你想保持对函数的引用但不能直接执行它?如果是这种情况,您可以存储对它的引用并删除原始文件:

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

要调用它,您现在可以使用:

_exampleBackup();

要恢复它,如果你需要:

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

答案 3 :(得分:4)

该功能仍在窗口中。

您在脚本标记内放置的代码将在创建元素时运行,并且不再(大致)自身没有值。删除标记不会影响文档及其对文档的影响(通常)。

要删除函数,需要删除example对象上的window属性,这是函数的定义方式,运行上面的代码。

答案 4 :(得分:1)

$('#someJS').remove();只是从DOM中删除text,但对实际函数(也不是文件)没有任何作用,因为它被解析并执行。

删除该功能,您可以将其设置为null,或者只使用example=function(){};

覆盖它