<script type="text/javascript"> var obj = (function() { var value = 1; return { increase: function(inc) { value += inc; return this; }, getValue: function() { return value; } } }()); //obj是一个匿名函数 //如果使用var obj = function(){}();的形式书写的话,obj就表示为return后的对象 //不加最后的括号的话,则表示整个函数 //这样的写法就可以让外面无法访问到本地的value了 //但是return返回的对象则可以使用定义的value //这就表示此函数已经返回,照理说函数的所有内容应该都已销毁,可是value却保存了下来,这就是闭包的体现 //闭包的写法比较灵活,代码也比较难看懂 //这里实际上返回的是对象字面量形式,不是传统意义上new出来的对象 //这里所谓的value并非此对象的私有变量,而是此对象的父函数的局部变量,由于在该对象中使用到了这个value //所以不能直接销毁,而是继续给其子函数使用,直到子函数销毁为止 console.log(obj.value);//显示undefined,无法获取 console.log(obj.increase(2).getValue());//3 var Obj2 = function() {//javascript中,函数也是对象 this.value = 1; } Obj2.prototype.increase = function(inc) { this.value += inc; return this; } Obj2.prototype.getValue = function() { return this.value; } var obj2 = new Obj2(); //使用js中new的方式创建的对象,是可以从外部访问到变量的 //这是因为javascript中没有private属性的缘故 console.log(obj2.value);//1 console.log(obj2.increase(2).getValue());//3 </script>
看javascript语言精粹闭包章节之后做的试验,虽然代码很短,但是内容还是很丰富的,对于我理解闭包还是很有帮助的。