0

我有这样的代码:(在 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它。这不是对全局命名空间的污染吗?

4

4 回答 4

5

您没有使用varwith Marker,因此它是一个全局变量,而不是作用于函数。

于 2012-07-06T07:14:01.437 回答
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只是因为它是代码中的全局变量。

于 2012-07-06T07:18:47.120 回答
0

因为你还没有把varMarker 放在前面,所以它是在全局级别创建的。

于 2012-07-06T07:15:01.173 回答
0

闭包只是上层范围。例如:

( function() {
    var i = 0;
    ( function() {
        // i is in the closure, the upper scope
    } () );
} () );

不要忘记 javascript 的唯一作用域是函数作用域。

(function(){})();是一个立即调用的函数表达式。

但是,是的,对于你的例子,问题只是你错过了var,所以Marker是一个全局变量。

于 2012-07-06T07:22:21.350 回答