javascript 闭包入门详解

发布时间:2020-12-03编辑:脚本学堂
通过例子学习javascript 闭包的用法,javascript可以实现public 和private,创建非匿名闭包最简单的语法,闭包的使用,实现了状态,属性的保持。

javascript 闭包是一个很有趣的东东。实现了public 和private。

创建一个非匿名闭包最简单的语法:
 

var obj = (function(){//各种代码  });

闭包最经典的例子:
 

var makeCounter = (function () {
var i = 1;
this.test=function(){
console.log(i);
i++;
}
return this;
});
var obj = makeCounter();
obj.test(); // 1
obj.test(); // 2
var obj1 = makeCounter();
obj1.test(); // 1
obj1.test(); // 2
private 与 public :


var makeCounter= (function () {
var i = 1;
//这货是private的
function log(){
console.log(i);
i++;
}
//这货是public的
this.test(){
log();
}
return this;
});
var obj = makeCounter();
obj.test(); // 1
obj.test(); // 2
obj.log(); //undefined

自执行函数:
var obj = (function(window){
//各种代码
}(window));

经常都会这样写:
 

var obj= (function () {
var i = 1;
this.test=function(){
console.log(i);
i++;
}
return this;
}());
obj.test(); // 1
obj.test(); // 2

把两步写成了一步。
//这是一个函数。它应该这样用obj()
var makeCounter = function () {
//各种代码
}
//这是一个对象。它类似于 var obj = makeCounter();
var obj = (function () {
//各种代码
}());

它也可以有参数:
 

var output = "new test";
var obj = (function (msg) {
this.test = function(){
console.log(msg);
}
return this;
}(output));
obj.test();

它还可以更复杂更高级点:
 

var output = "new test";
var obj = (function (obj, msg) {
//这货也是私有的。类似obj.i(!=obj.i),却又不是obj.i(因为外部不可访问)。
var i = 1;
//private
function log() {
console.log(i + " : " + msg);
i++;
}
//public
obj.test = function () {
log();
}
return obj;
}(obj, output));
obj.test(); // 1 : new test
obj.i = 100;
//i没被改变
obj.test(); // 2 : new test

闭包的使用,实现了状态,属性的保持;
避免了全局变量满屏飞舞;结束了变量老是被重定义,重赋值的尴尬局面。
还可以将一个对象分部到多个js文件。