Javascript(七):闭包

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tuyi5078/article/details/79974545

       首先,接着上节的内容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语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。

猜你喜欢

转载自blog.csdn.net/tuyi5078/article/details/79974545