javascript对闭包的深入理解

最近看了一些关于闭包的内容,自己总结了一下:

闭包其实就是内部函数调用外部函数的变量,使变量一直存在于内存中.
内部函数是一个匿名函数
先给大家看一个例子:

function getFunction(){
    var result = new Array();
 for(var i=0;i<10;i++){
     result[i] = function(){
      alert(i);
  }
 }
 return result;
}

var result1 = getFunction();
for(var j=0;j<10;j++){
    result1[j]();
}

可能大家的理想结果是当i=0 输出0 i=1 输出1 但是结果并不是,结果是输出的结果都是10。
为什么会导致这个结果,我们从作用域链的角度进行分析:
下面都是个人理解,欢迎大家指出错误:

每一个内部函数都会保存着属于自己的作用域链,而它自己的作用域链包括了自己的活动对象,外部函数的活动对象,全局的
活动对象,当查找变量时会逐级查找,分析上面内部函数的作用域链:

内部函数的活动对象有:arguments=null this = window(如果不指定this,内部函数this将为window)
外部函数的活动对象有:arguments=null this=getFunction result(new Array()) i=10
全局函数的活动对象有:result1=undefined this = window getFunction-->getFunction的作用域链
 
通过上面对活动对象的分析:
当调用内部函数时,获取的i永远为10;

那么我们将如何解决,方法如下:

function getFunction(){
    var result = new Array();
 for(var i=0;i<10;i++){
     result[i] = function(num){
      return function(){
       alert(num);
   };
  }(i);
 }
 return result;
}

var result1 = getFunction();
for(var i=0;i<10;i++){
    result1[i]();
}

内部函数的活动对象有:arguments=null this = window(如果不指定this,内部函数this将为window)
外部函数1的活动对象有:arguments[num] this=window(如果不指定this,内部函数this将为window) num(保存着1-9)
外部函数2的活动对象有:arguments=null this=getFunction result(new Array())  i=10
全局函数的活动对象有:result1=undefined this = window getFunction-->getFunction的作用域链

所以当调用时,找到num,所以会输出正常.

理解下面的例子:
var name = "The Window";

var Person = {
   name : "Person name",
   getName :function(){
       return function(){
    return this.name;
    }
   }
};

alert(Person.getName()());

输出的结果是 "The Window" ,下面是对结果的分析:
内部函数查找arguments和this两个变量时,只会查找到其当前活动对象为止

分析活动对象:
内部函数的活动对象有:this=window arguments=null

所以此时this=window,相当于调用window.name,所以输出为"The Window"
那怎样才能让其输出为"Person name":

var name = "The Window";

var Person = {
   name : "Person name",
   getName :function(){
       that = this;
       return function(){
    return that.name;
    }
   }
};


alert(Person.getName()());

输出结果是 "Person name",下面是对结果的分析:
分析活动对象:
内部函数的活动对象有:this=window arguments=null
外部函数的活动对象有:this=Person arguments=null that=this

所以当调用that.name时会返回"Person name";

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值