2011-08-01 28 views
0

是否可以在JS中加载具有相同变量/函数的多个脚本,而不会覆盖变量的旧值。例如,为每个加载的脚本创建一个自己的作用域/沙箱或对象。加载具有相同变量/函数的多个脚本

文件加载:

SCRIPT1:

<script> 
function init() { 
    do something... 
} 
</script> 

SCRIPT2:

<script> 
function init() { 
    do something... 
} 
</script> 

而且加载后调用script1.init()或script2.init(),这可能吗?

回答

3

你可以用自动调用匿名函数来包装每段代码,这将有效地命名该部分的命名空间。

(function() { 
    function init() { 
     // do something... 
    } 
})(); 

init(); // ReferenceError 

但是,如果你不能改变的代码,第二init将覆盖第一个定义。

但是......

而且加载后调用script1.init()或script2.init(),这可能吗?

...很混乱。你是否已经有了init()作为对象的方法?如果是这样,他们将不会相互覆盖。

+0

我想从任何源服务器加载代码,并创建一个应该防止代码覆盖的对象,但是我想加载的代码不可改变。 –

1

不幸的是,没有。单个页面上只有一个全局范围。

然而,通过使用类似的模块模式,你可以做一个假的命名空间:

例如:

var script1 = (function() { 
    var that = {}; 
    that.init = function() { 
     do something... 
    }; 

    more functions... 

    return that; 
})(); 

,然后通过使用script1.init(叫);

你可以找到更多关于模块模式here

+0

问题是我想编写一个网站,用户可以添加他/她自己的插件到网站,该插件的代码是从任何来源加载的,但我不想在代码中加载iframe中。解决方案的问题在于用户必须以给定的设计模式编写代码,但我希望他们让他们以自己想要的方式编写代码。 –

+0

在这种情况下,您可能想要研究诸如jsfiddle之类的网站如何实现沙盒。 –

相关问题