删除的JavaScript仍然是可执行的

删除的JavaScript仍然是可执行的,javascript,jquery,Javascript,Jquery,如果我有以下JavaScript代码: <script id="someJS"> var boom = 'boom'; function example(){ alert(boom); } </script> 我仍然可以调用example(),即使JavaScript函数不再位于。。。我怎样才能删除它 我不想使用:boom=null为实际函数和变量设置null;示例=空因为我并不总是知道JavaScript文件中有什么。例

如果我有以下JavaScript代码:

<script id="someJS">

    var boom = 'boom';

    function example(){

        alert(boom);
    }

</script>
我仍然可以调用
example()
,即使JavaScript函数不再位于。。。我怎样才能删除它

我不想使用:
boom=null为实际函数和变量设置null;示例=空因为我并不总是知道JavaScript文件中有什么。例如函数名、变量等。我需要能够删除该脚本标记中的内容的完整性。


更新:对于那些希望了解此用户案例的人:

基本上,在我正在开发的一个应用程序中,我们为某些客户端添加了自定义JavaScript,当单击按钮(例如保存)时,会检查某些函数是否存在,然后运行它们。然而,由于这个保存按钮是通用的,这意味着自定义代码在添加后会一直被调用,即使它不再相关

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

DynamicJS = {

    boom: 'boom',

    example: function(message) {

        alert(message);

    }

}
然后我们就可以做:
删除DyanmicJS

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

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

我怎样才能删除它?我不想将实际函数设为null,因为我并不总是知道JS文件中的内容

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

即使您可以推断代码的某些作用(例如,通过列出前后的全局变量),但您可以删除检测到的新全局变量(或者至少将它们设置为
null
undefined
,因为
delete
与通过函数声明或
var
添加的全局变量不起作用),这并没有告诉您哪些事件处理程序、web工作程序等。代码可能已连接。

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

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

window.example = null;
但是,显然您不想这样做,如果其他地方的脚本实际使用了
示例
,这将导致大量错误

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

window.example = function(){};
这将防止“删除”导致错误。

(除了在预期情况下不返回值的函数外)

一旦函数被处理,它现在是
窗口的可执行函数列表的一部分,无论是否删除原始源代码

要完全删除该函数,请尝试:

window['example'] = null;
但是,根据您最后的评论:

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

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

var _exampleBackup = window['example'];
window['example'] = null;
要调用它,您现在可以使用:

_exampleBackup();
如果需要,请执行以下操作:

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

该函数仍在窗口中

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

要删除函数,您需要删除
窗口
对象上的
示例
属性,这是函数的定义方式,运行上面的代码。

$('#someJS')。remove()
只不过是从DOM中删除
文本
,但对实际函数(或文件)没有任何作用,因为它是解析和执行的

要删除该函数,您可以将其设置为
null
,或者简单地用
example=function(){}覆盖它

JavaScript中有一个称为提升的概念。在此阶段,编译器解析所有JavaScript代码,并在作用域的开头声明变量和函数。在您的例子中,函数示例和变量boom已经声明并保存在内存中。当您运行该方法时,解释器将调用该方法并解释它,而不是解释实际的JavaScript代码。您将在脚本块进入内存后删除它。这就是为什么它仍然是可执行的

实现这一点的方法

1) 使用面向对象的方法。将方法添加到对象中,如果要删除该方法,请使用删除该属性。
2) 创建一个包含要执行的代码的函数的变量,并在需要时将该变量设置为未定义。

“我不想将实际函数设为空,因为我并不总是知道JS文件中有什么内容。”这到底是什么意思?如
示例=null
;为什么要删除函数?还有它的消极方面是什么?这将是唯一的方法下面有一些答案来满足你的要求。。。但我可能会提出真正的问题是什么?显然地(出于某种原因…@Cerbrus哇,完全错过了最后的评论!刚刚更新了我的地址-非常感谢您指出。。。total*facepalm*moment=PIt应该更清楚,“一旦函数被处理”指的是
标记及其正在处理的内容,而不是(人们可能会解释这句话)函数被调用。-兴趣
window['example'] = _exampleBackup;
example();