如何清除对不再存在的Javascript函数的引用?

时间:2014-11-17 03:46:22

标签: javascript jquery ajax

我正在开发一个项目,该项目使用AJAX在一个单一的文本块中下载HTML,CSS和Javascript,然后将其附加到页面上的元素。这是代码:

_t.stage.empty();
_t.stage.html(DATA);

这很好用。

问题在于:

将HTML添加到舞台后,我调用此函数:

if(initApp != null && typeof(initApp) == "function") initApp();// Checks for initApp(). If exists, executes.

如果我加载具有此功能的页面,然后加载没有此功能的页面,则执行第一页的功能。这是一些用于理解结果的伪代码。

第1页:

This is a page.
 <style>...</style>
 <script> function initApp(){ alert("hello"); } </script>

运行此页面时,会显示一个带有“hello”文本的警告框。

第2页:(没有initApp()函数)

  This is page 2.
  <style>...</style>

当页面运行时,会显示一个带有“hello”文本的警告框。

请注意:这些页面加载了AJAX并插入到已加载页面的HTML中。

2 个答案:

答案 0 :(得分:1)

要确切地说出你要做的事情并不容易,但是如果你要做的就是这样做,以致调用initApp()的其他一些代码在调用时不会发生任何事情那么,你可以简单地将函数重新定义为这样的do-nothing函数:

initApp = function() {}

函数的最新定义优先(例如替换任何先前的定义)。

如果您新加载的代码包含第二次加载脚本时不想调用的initApp()实现,那么您运气不好。你不能阻止它。您需要更改代码的结构,以便动态加载的代码不会执行您不想执行的内容。有很多不同的方法可以做到这一点。例如,您可以使用全局布尔值来跟踪是否已调用init代码。

var initCalled = false;

function initApp() {
    if (!initCalled) {
        initCalled = true;
        // rest of initialization code here
    }
}

initApp();   // will only actually do anything the first time it's called
             // even if it is loaded more than once

从评论中可以看出,您似乎认为使用不同代码重新加载脚本标记会以某种方式使前一个脚本中的代码消失。它不会。一旦加载了一个函数,它就会保持加载状态,除非它被重新定义为其他东西,或者除非某些代码明确地从对象中删除了一个属性。无论代码是如何加载的,无论是在核心页面还是外部脚本文件中。

答案 1 :(得分:1)

  

不再存在的Javascript函数

这是一个不好的前提。这些函数仍然存在,从第二个AJAX加载最终执行它的事实可以看出这一点。 <script>标签被替换而不再出现在文档中的事实并未取消定义该功能。这就像是问为什么你的电视机仍然坏了如果打破它的窃贼不再存在。

您可以做两件基本事情:

a)自己明确清除函数:

if (initApp != null && typeof(initApp) == "function") {
    initApp();
    delete window.initApp;
}

b)将每个AJAX页面的函数名称更改为唯一(或者具有相同构思的函数的命名空间),可能与AJAX页面的名称相关联,因此您可以以更具体的方式调用它。