为什么可以访问“;什么是关闭;

Why can access the variable in "what-I-think-is-a-closure"?

本文关键字:什么 访问 为什么      更新时间:2023-09-26

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

您没有将varMarker一起使用,因此它是一个全局变量,而不是作用域到函数。

您的代码不是闭包。闭包如下所示,您需要返回函数out,注意变量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只是因为它是代码中的全局变量。

因为您没有将var放在Marker前面,所以它是在全局级别创建的。

闭包只是上层作用域。例如:

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

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

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

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