首先,接着上节的内容Javascript(六):函数先补充学习一下。我们用已有的知识写一个“加法”的函数:
function and(a,b){
a + b;
}
var x= and(1,1);
console.log('x=',x)
上面代码的执行结果:
会显示x未被定义。因为,上面代码只表明了函数的入口,没有一个出口。在这里函数的入口function后括号中的参数信息,函数的出口需要用到关键词return:
function and(a,b){
var r;
r = a + b;
return r;
}
var x= and(1,1);
console.log('x=',x)
执行上述修改后的代码,就会返回x = 2。return就相当于函数的出口,使得这个函数有一个返回值。
当两个甚至更多的函数组合在一起时,会出现一些新的功能来解决一些问题。定义一个user对象:
var user ={
name: '王花花',
age: '21',
sex: '女'
}
通过user.age= '22',我们可以去改变user对象中的age值。但,这样去做值的改变时,很可能没有办法去监控每一步值的变化过程。通过母函数来获取子函数的值,这样的方式称为闭包(closure)。我们先看下面这个例子:
function user(name){
var age,sex;
return{
getName: function( ){
return name;
},
setName: function(newName){
name = newName;
},
getAge: function( ){
return age;
},
setAge: function(newAge){
age = newAge;
},
getSex: function( ){
return sex;
},
setSex: function(newSex){
sex = newSex;
}
}
}
var whh = user('王花花');
var name = whh.getName();
whh.setAge(24);
whh.setSex('女');
var age = whh.getAge();
var sex = whh.getSex();
console.log(name,age,sex);
执行结果如下:
在user这个函数中的name、age、sex都属于局部变量,在该函数外部,我们没法去访问到这些参数的值,但在user函数内的子函数,如getName、setName,它们是可以获取到user中的变量值的,所以我们可以通过子函数来返回母函数中的那些局部变量的值,这样的一种方法就是闭包。
关于闭包的理解,在这里我参考了一篇写得很详细的博客:学习Javascript闭包(Closure)。根据这篇博客,我继续写关于闭包的学习笔记。
理解闭包,首先,要明白变量作用域的概念。变量的作用域分为全局变量和局部变量两种。在js中,一个函数内部可以直接读取全局变量;而函数外部无法读取函数内的局部变量。在这里,需要注意一个很重要的问题:函数内部声明变量时,一定要用var命令!如果前面不添加var关键词,会被视为一个全局变量。有些时候,我们需要得到函数内部的局部变量,那么就要通过上述代码的方法实现,也就是闭包,闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。