我们说我有一个Javascript文件名数组:
["funScriptStuff.js", "jQuery.js", "dojo.js", "scriptyScript.js"]
我怎么能彼此独立地执行它们?
例如,让我们假设一个脚本做了一些像
这样的邪恶的东西var undefined = true;
var window = "Windows 98";
另一个脚本的代码依赖于这些全局变量是未经破坏的
if (a !== undefined) {
window.open(url);
}
如果第一个脚本先运行,它会破坏第二个脚本中的所有内容。在不更改这些脚本文件中的任何内容的情况下,如何相互独立地运行它们以防止它们相互混乱?
编辑:我不是要问用什么Javascript模式来防止命名空间冲突,比如将我的代码包装在一个大的闭包中等等。我知道那些。我试图创建一个环境,在这个环境中你可以运行我无法控制的任意脚本,而不会让他们互相踩到脚趾。
答案 0 :(得分:3)
据我所知,你无法在同一份文件中可靠地回滚全局变量的污染。
我认为您必须在不同域上的单独文档(= <iframe>
s)中运行它们。没有其他方法可以防止他们100%确定地相互搞乱。
(“不同域名”的目的是防止真正恶意代码污染其他脚本(因为同一域上的iframe可以相互访问,因此恶意脚本可能正在寻找其他iframes妥协。)
答案 1 :(得分:2)
请定义您的目标环境。 在浏览器中只有文件名,你唯一可以做的就是用XHR下载每个脚本,把它当作字符串数据,然后eval
它(是的,解决方案听起来很笨拙) )。要防止恶意脚本弄乱您的全局范围,您需要使用with
语句:
var safeGlobal = {};
safeGlobal.isHoneyPot = true; // whatever scripts might expect in Global scope
with ( safeGlobal ) {
eval( scriptText );
}
delete safeGlobal; // purge whatever pollution script leaves in Global scope
浏览器中的另一种方法是使用多个窗口或iframe,但这不会使命名空间平面,因此您必须通过window / iframe引用函数变量
答案 2 :(得分:0)
我经常使用此pattern。
(function(myNamespace, $, undefined) {
//Public Method
myNamespace.foo = function() {
// ..
};
//Private Method
function bar() {
// ..
}
}(window.myNamespace = window.myNamespace || {}, jQuery));
因为未提供第三个参数,所以肯定是 undefined
如果您使用jQuery,则确保$
未设置为其他内容(当然,除非jQuery
设置为其他内容)。
答案 3 :(得分:0)
.js文件只是页面中包含的javascript块。记录。根据您拥有的标准将脚本标记写入页面并不困难。因此,您可以使用一个脚本来检查某些条件,然后根据该条件添加您想要的任何外部脚本。
然而,就他们的“独立性”而言,你有一些问题(通常是Javascript的评论家的主要问题),这就是你在页面中输入的所有内容都是全局的,并且对其他所有内容都是可见的。这实际上非常有用,但它确实意味着你必须非常小心地封装你的对象,以防止它们彼此流血。
因此,如果所有这些脚本都是您自己的,您可以通过确保每组工具都是非常独特的更大对象的一部分来控制它。至于使用像jQuery这样的框架,你必须要小心不要侵犯他们的对象。然而,他们考虑到了这一点,所以,只要你知道要寻找什么,你应该没问题。