我正在创建一个可以在各种网站上使用的脚本。由于我不知道它的使用情况,我希望能够将它放在各种沙箱中,它不会影响页面上的其他javascripts,反过来也不受其他javascripts的影响。< / p>
最基本的开始是使用自我调用函数:
(function(){
x = function(){ alert('hi!');
x();
})();
但我的问题是,如果已经分配了x,则无法覆盖它:
x = function(){ alert('too late!');
(function(){
x = function(){ alert('hi!');
x();
})();
这会警告“太迟了!”而不是“嗨!”,这不是我想要的效果。有人可以帮忙吗?
答案 0 :(得分: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'
这将警告'hi'两次,因为没有var
语句,您在两个范围内使用相同的x
值。如果您在自执行函数中使用var
语句,则x
的第二次调用会提醒'太晚了!'。
答案 1 :(得分:1)
在这两种情况下,您都忘了在}
部分之后添加alert()
。
看看这个小提琴:jsfiddle.net/XSebK/2/ - 它实际上按预期工作,代码如下:
x = function(){ alert('too late!'); };
(function(){
x = function(){ alert('hi!'); }
x();
})();