为什么可以在“我认为什么是封闭”中访问变量?

时间:2012-07-06 07:12:22

标签: javascript closures

我有这样的代码:(和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 个答案:

答案 0 :(得分:5)

您尚未将varMarker一起使用,因此它是一个全局变量,而不是作用于该函数。

答案 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是一个全局变量。