2013-06-03 48 views
0

我有一些机器生成的Javascript从一个特定的游戏制作应用程序,不适合关闭。我试过环绕整个事情就像这样:分离外部Javascript和防止污染?

var gameInstance = (function() { 

    // Some code that defines stuff 

    return { 
     initGame: function() { 
      _VD1(); 
     } 
    } 
})() 

我正在寻找一种方法来防止它泄漏到全局命名空间,并能够在事后清理整个游戏。这种特定类型的Closure似乎仍然导致许多功能的泄露。它隐藏了一些东西,如_VD1调用 - 但其他东西仍然设法泄漏。我可以注意什么来防止这种情况发生?

+0

你添加其位的灵感? – Alnitak

+0

一切除了//一些代码定义的东西;这就是机器生成的代码所在的位置。 –

+0

所以原始代码只是'_VD1()'? – Alnitak

回答

3

这听起来像你使用的代码是声明了很多变量,而不使用var关键字。

您可以通过它并在使用变量的最外层函数范围的顶部使用var关键字声明所有变量。

如果根本不能修改其他脚本,除了确保所有自己的脚本正确命名空间外,没有太多可做的事情,以便它们不会受到所有全局变量的干扰该脚本正在声明/修改。

+0

问题是有时需要加载多个这些脚本(它可能会被执行两次......并且没有办法重置它的状态:) :(我真的需要能够包含并且杀死它) –

+0

看起来像这就是问题 –

+0

这绝对是一个很好的方法,它保留了封闭中的所有变量和函数@VaughanHilts你是否说你需要同时激活多个游戏实例?所以,你可以做'var instance1 = new gameInstance;'? – ahuth

0

听起来就像你试图保留一些JavaScript沙箱,可能可以使用iframe来实现这一点。这是未经测试的,但可以作为启发;

var sb = document.createElement('iframe'); 
document.body.appendChild(sb); 
sb.document.write(' 
<html> 
<head></head> 
<body> 
<script> 
gameInstance = (function() { 

    // Some code that defines stuff 

    return { 
     initGame: function() { 
      _VD1(); 
     } 
    } 
})() 

</script> 
</body> 
</html>'); 

var gameInstance = sb.gameInstance; 
+0

为什么将代码作为文本附加到文档而不是仅使用闭包? – ahuth

0

也许http://jqueryboilerplate.com/给你

// the semi-colon before function invocation is a safety net against concatenated 
// scripts and/or other plugins which may not be closed properly. 
;(function ($, window, document, undefined) { 

})(jQuery, window, document);