删除的JavaScript仍然是可执行的

Cam*_*ron 21 javascript jquery

如果我有以下JavaScript代码:

<script id="someJS">

    var boom = 'boom';

    function example(){

        alert(boom);
    }

</script>
Run Code Online (Sandbox Code Playgroud)

然后做:

$('#someJS').remove();
Run Code Online (Sandbox Code Playgroud)

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

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


更新:对于那些想知道用户案例的人:

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

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

DynamicJS = {

    boom: 'boom',

    example: function(message) {

        alert(message);

    }

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

T.J*_*der 36

我该如何删除它?我不想将实际函数置空,因为我并不总是知道JS文件中的内容.

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

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

  • 这可能是最合适的答案,特别是与OP的请求相关:*如果您不知道代码的作用,则无法撤消*. (3认同)

Cer*_*rus 16

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

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

window.example = null;
Run Code Online (Sandbox Code Playgroud)

但是,显然你不想这样做,如果在其他地方有实际使用的脚本,这将导致一大堆错误example.

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

window.example = function(){};
Run Code Online (Sandbox Code Playgroud)

这将防止"删除"导致错误.
(除了可能预期的函数不返回值)


new*_*rey 6

处理完该函数后,它现在window是函数可执行列表的一部分- 无论是否删除原始源.

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

window['example'] = null;
Run Code Online (Sandbox Code Playgroud)

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

我不想将实际函数置空,因为我并不总是知道JS文件中的内容.

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

var _exampleBackup = window['example'];
window['example'] = null;
Run Code Online (Sandbox Code Playgroud)

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

_exampleBackup();
Run Code Online (Sandbox Code Playgroud)

要恢复它,如果你需要:

window['example'] = _exampleBackup;
example();
Run Code Online (Sandbox Code Playgroud)


php*_*_qq 6

该功能仍在窗口中。

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

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