【问题标题】:JavaScript memory loss with Prototype's Ajax.Updater?Prototype 的 Ajax.Updater 导致 JavaScript 内存丢失?
【发布时间】:2011-04-12 13:02:53
【问题描述】:

我不确定这是 Prototype 特有的问题,但由于我在不使用 Prototype 时没有遇到问题,所以我猜是的。

我正在使用 Ajax.Updater 将一些外部 HTML 附加到我的 DOM 树中。在外部文件中有一些脚本元素。由于我已将 evalScripts 选项设置为 true,因此它们都会被评估。但是当我稍后尝试访问已在脚本元素中设置的对象时,它们不再存在。例如:

<script type="text/javascript">
    var test = true;
    console.log(test); // Works fine, obviously.
</script>

<input type="text" onkeydown="console.log(test)"> <!-- Throws an ReferenceError exception (test is not defined) when the event is fired. -->

如果我使用 Ajax.Updater 请求此脚本元素将按预期运行,但在评估之后测试变量似乎被删除。有谁知道怎么回事?

【问题讨论】:

  • 试试console.log(window.test)或者更好window.test = true

标签: javascript prototypejs


【解决方案1】:

你可以解决这个问题

<script type="text/javascript">
    window.test = true; // global on window
    console.log(test); // Works fine, obviously.
</script>

Ajax.Updater 最终会在您的脚本上调用它:

function evalScripts() {
    return this.extractScripts().map(function(script) { return eval(script) });
}

由于eval在本地工作,你发现var test实际上是function(script) { ... }的局部变量

这是你的问题。这是原型没有像 jQuery 那样进行全局评估的问题。

你可以努力寻找它,也可以戳这个ticket

【讨论】:

  • 是的,附加到现有对象有效,但不适用于我的具体情况。知道是什么导致了这个问题吗?
  • @user544941 你是什么意思它不适用?如果您想要一个全局变量,请将其写入窗口对象。这是制作全局变量的方法。
  • 当然不是。您只是在窗口对象中添加一个变量。如果您在全局命名空间中使用 var 关键字,那么您正在创建一个全局变量。
  • @user544941 有同样的事情。在浏览器中,[[Global Context]] 解析为 Window 对象。您创建的每个全局变量都将成为全局对象的一个​​属性。在浏览器中window === global Object。在其他环境中,全局对象 (global) 不像 window 那样具有双重含义。 (是的,这对浏览器来说是糟糕的设计)
  • 好的,谢谢你的信息。我的意思是不适用很难解释,但假设我使用 Ajax.Updater 请求的大量代码的旧项目(这不是我的想法)并设置所有这些变量、函数和对象到窗口对象会花费很多时间。反过来也行不通(window.test 在触发 onkeydown 事件时未定义)。是什么导致了这个问题?
猜你喜欢
  • 2015-03-06
  • 2013-08-17
  • 2010-10-19
  • 1970-01-01
  • 2011-04-18
  • 2014-07-19
  • 2012-05-30
  • 2014-04-16
  • 1970-01-01
相关资源
最近更新 更多