在动态更改数据后检查函数是否存在(在 ajax 调用之后)

check if a function exist after dynamically changing data (after an ajax call)

我有一个函数在 window 加载时执行

<div id="removeItOnAjaxCall">
<script>
    foo = function() {
    // some stuff
    }
</script>
</div>

还有一个 ajax 调用可以从 DOM 等中删除此函数。

    new Ajax.Updater('chkboxpos, 'myscript.php', {
        onSuccess: function(response) {
            $('removeItOnAjaxCall').remove(); //now I don't have foo function in my DOM. but DOM think it is
        }
    });

现在如果我调用这个函数我会得到一个错误

element is null
var method = element.tagName.toLowerCase();

因为 DOM 认为它定义了该函数,但实际上它没有。我希望我现在说得更清楚了。

foo = function() {
  // some stuff
 }    
if(typeof foo == "function")){
    console.log("function exist");
}

您对 <script> 标签的工作方式感到困惑。一旦遇到并解析了脚本,其中的任何定义都不会被删除,即使 script 标记或其封闭元素被删除也是如此。函数未定义的唯一方法是明确地这样做,例如 delete window.fun;fun = null.

因此,您的担心是错误的。无需检查该函数是否仍然存在——它确实存在,无论您在 ajax 处理程序中操作了什么元素。为什么您认为函数会变成未定义的?

DOM 从根本上与 JS 命名空间分开。 DOM 中不包含函数;它们包含在 JS 命名空间中。 DOM 不知道什么功能可能存在或不存在。您对 DOM 所做的任何事情都不会影响 JS 逻辑或数据。由于 DOM 中不存在函数,因此无法从 DOM 中删除它们。你说

Now if I make a call to this function I got an error because the DOM thinks it has that function defined but actually it doesn't have one.

关于您的错误:

element is null
var method = element.tagName.toLowerCase();

这与功能无关foo。由于该元素已被删除,因此它为空。您无法获取不存在的元素的 tagName。你说你是 "making a call to this function",但你并没有调用那个函数。您正在尝试获取元素的 tagName,这是完全不同的事情。

话虽如此,将脚本标签放置在可能会被删除的元素中似乎有点奇怪——你为什么要这样做?