JavaScript中闭包学习 –2016.4.7
最近在看prototype.js源码,发现里面有很多的有意思的代码,了解到了javascript的闭包思想,然后通过网上的资料和自己敲代码,来学习它,记下来梳理下思路,做个笔记。
定义:
维基百科定义:引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例
简单理解:where a function remembers what happens around it
常见方式:
一般常见的方式是定义一个function a在这个function 的内部返回一个b函数,b函数对a某个变量引用
function a(){
return function b (){
}
}
要理解闭包首先需要了解全局变量和局部变量的概念 ,注意的地方是函数内部没有 用 var 申明的变量是全局变量,没有申明的函数也是一样(函数其实也是一种变量)
var a = 1;
var d = 4;
function f1(){
var b =2;
c =3;
var d = 5;
console.log(a) //1
console.log(b);//2
console.log(c);//3
console.log(d);//5
}
f1();
console.log(a);//1
console.log(b);//error
console.log(c)//3
function f2(){
}
简单例子
f2是使用闭包,之所以a的值能被保留是因为 f2Inner这个匿名啊函数是附给全局变量的,因此f2Inner一直都在内存中
而f2被f2Inner引用,因此f2也一直在内存中,用闭包的好处,是将变量放在了函数内部,不会被污染,而f3这种申明
全局变量也是可以实现这种功能,全局变量是容易被污染的。
“`javascript
function f2(){
var a = 1;
add = function(){a+1} //add是一个全局变量,是可被调用的
return function f2Inner(){
console.log(n);
}
}
f2() //n=1
add();//n=2
f2() // n =3
//不使用闭包实现f2的功能
var a = 1;
function f3(){
console.log(a);
add = function(){a+1};
}
f3();
add();
f3();
“`
常见用法:
“`javascript
var test1 = function () {
var name = “The Window”;
var object1 = {
name: “My Object”,
getNameFunc1: function () {
return function () {
return this.name;
};
},
getNameFunc2: function () {
var that = this;
return function () {
return that.getNameFunc2();
}
}
}
console.log(object1.getNameFunc1()) // TheWindow
console.log(object1.getNameFunc2()) //My Object
“`
###javascript中一些方法常见的闭包
“`javascript
var closeure = {
test3:function(){
function main1(links){
for (var i=0; i