2011-05-20 19 views
4

我正在创建一个可用于各种网站的脚本。由于我不知道它的使用情况,所以我希望能够将它放置在各种沙箱中,它不会影响页面上的其他JavaScript,并且不会受到其他JavaScript的影响。创建一个独立于其他javascript的私有名称空间?

最基本的开始使用自调用函数:

(function(){ 
    x = function(){ alert('hi!'); 
    x(); 
})(); 

但我的问题是,如果X是已分配为这样的,你不能覆盖它:

x = function(){ alert('too late!'); 
(function(){ 
    x = function(){ alert('hi!'); 
    x(); 
})(); 

这将警惕“太迟了!”而不是“嗨!”,这不是我想要的效果。谁能帮忙?

回答

5

不要忘记使用var语句,如果您不使用它,变量将在全局范围内声明。尽管你在正确的轨道上,在立即执行的函数中创建你自己的范围。例如:

var x = function() { alert('foo') }; 
(function() { 
    var x = function() { alert('bar') } 
    x() // 'bar' 
}()); 
x() // 'foo' 

再回到您的示例:

x = function(){ alert('too late!')}; 
(function(){ 
    x = function(){ alert('hi!')}; 
    x(); // 'hi' 
})(); 
x(); // 'hi' 

这将提醒“喜”的两倍,因为没有var声明你是在这两个范围相同x价值的工作。如果您要在自执行功能中使用var语句,则第二次调用x会提示“太迟!”。

+0

谢谢主席先生!最长的时间我无法辨认出我的愚蠢。这是一个错误的右括号的简单行为!作为以'})();'工作,'}());'结尾的自执行函数''是正确的用法!在这种情况下,添加'var'几乎没有什么区别。 – smdrager 2011-05-20 00:59:04

1

在这两种情况下,您忘记了在alert()之后添加}

看看这个小提琴:jsfiddle.net/XSebK/2/ - 它的实际工作,你希望和代码如下所示:

x = function(){ alert('too late!'); }; 

(function(){ 
    x = function(){ alert('hi!'); } 
    x(); 
})(); 
相关问题