我有这样的代码:(和jsfiddle http://jsfiddle.net/k6zNm/3/)
(function(){
Marker = function(opts){
var marker = this;
marker.Version = "2012.Jul.06";
marker.HelloWorld = function(){
return marker.Version;
}
}
})();
window.mymarker = new Marker();
$("div#message").text(mymarker.HelloWorld());
代码工作正常。但我认为(function(){})();
是一个闭包。为什么我可以访问其中的Marker
。这不是对全球命名空间的污染吗?
答案 0 :(得分:5)
您尚未将var
与Marker
一起使用,因此它是一个全局变量,而不是作用于该函数。
答案 1 :(得分:1)
您的代码不是封闭式的。闭包如下所示,您需要返回该函数,请注意变量version
超出了返回的函数范围。
var Marker = (function(){
var version = "2012.Jul.06";
return function(opts){
var marker = this;
marker.Version = version;
marker.HelloWorld = function(){
return marker.Version;
};
};
})();
您可以访问Marker
只是因为它是您代码中的全局变量。
答案 2 :(得分:0)
因为你没有把var
放在Marker面前,这就是它在全球范围内创建的原因。
答案 3 :(得分:0)
封闭只是上限范围。例如:
( function() {
var i = 0;
( function() {
// i is in the closure, the upper scope
} () );
} () );
不要忘记javascript的唯一范围是功能范围。
(function(){})();
是一个立即调用的函数表达式。
但是,是的,就你的例子而言,问题只是你错过了var
,所以Marker
是一个全局变量。