前言:

昨天写了一个关于Java内部的博客,在内部类的最后一点中谈到了Java闭包的概念,他是这样定义闭包的:闭包是一个可调用的对象,它记录了一些信息,这些信息来自创建它的作用域。结合Java的内部类可以很好的理解这一点(如有需要可参考ThinkInJava之内部类)。突然之间想到js中的闭包,一直都无法很好的理解,故借此又看了一下js中的闭包,对我个人而言,感悟良多,借此也与大家分享一下,希望可以帮助大家,并一起快乐的学习成长,天天向上。

零:js闭包概念(通过Java闭包和js嵌套函数和图一分析 :纯个人 见解,欢迎评论和建议)

  js:闭包是一个返回给调用者的对象,而这个返回对象携带了一些调用者无法获取的信息

一:js中的对象定义(因为是针对闭包的学习就只简单介绍一种定义方法) 

<script>
function Car() { //定义class
var color = "blue"; //定义属性
}
Car.prototype.getColor = function() { //通过原型定义方法
console.info(this.color)
return this.color;
}
var oCar1 = new Car();//创建对象实例
oCar1.getColor(); //调用方法
</script>

二:js中的变量作用域(全局变量和局部变量)

var a = "我是全局变量";
function myFunction() {
var b = "我是局部变量"
return a ;
}
function my2(){
  consoke.info(b) #报错
}

2.1  全局变量a:即属性window的属性,在同一页面内所有的js脚本,都共享同一个window对象,故共享全局变量a.

2.2 局部变量b :局部变量只能用于定义它函数内部。对于其他的函数或脚本代码是不可用的。

备注:变量声明时如果不使用 var 关键字,那么它就是一个全局变量,即便它在函数内定义。

三:计数器困境(引入问题) 

解题思路:需要一个变量,这个变量需要在方法内访问并加一,多次调用该变量就是多次加一的和,故不能把该变量定义在方法的内部,如果把该变量定义在方法的内部就不能实现多次调用返回多次调用的和,故把该方法定义为全局变量如下,但这样定义该变量即不安全如调用方法2 

var counter = 0;
function add() {
return counter += 1;
}
function myFunction(){
document.getElementById("demo").innerHTML = add();
}
function myFunction2(){
counter = 100;
document.getElementById("demo").innerHTML = add();
}
myFunction();
myFunction();//实现多次调用返回,多次调用的和
##counter =2
myFunction2();//但如果调用该方法,就不返回多次调用的和 #因为是全局变量,任何脚本都可更改该变量的值,这样及其不不安全。
##counter =101

解题思路2:如果能把count变量隐藏起来不让其它js方法修改它不就行了吗?如果我们熟悉Java语言,用Java就很容易解决该问题。因为Java提供的修饰符private可以控制属性的访问限制。并定义一个唯一public方法设置该属性(就是把属性定义为私有的,并提供唯一的get和set方法,就这么简单)。然而如果把问题抛给js就很难解决这个问题了,以为js没有提供这样的修饰符,来控制访问属性。如何解决类似Java private成员的问题请看下面

:JS的 内嵌函数(类比Java内部类 ,我们发现嵌套函数及其的像Java的内部类

最新文章

  1. Ubuntu Server 设置PPTP客户端连接
  2. Java数据类型和MySql数据类型对应表
  3. linux(centos)源码安装git
  4. sprin加载顺序
  5. php课程---随机数
  6. yii2中gii外网访问的配置方法
  7. 使用XIB实现一个简单view
  8. (转载整理)SAP ERP常用表
  9. ASP.Net WebForm学习笔记:一、aspx与服务器控件探秘
  10. 两个winform窗体同步
  11. spring Annotation 组分注塑
  12. docker网络解析
  13. [css]《css揭秘》学习(三)-灵活的背景定位
  14. 正确理解Mysql的列索引和多列索引
  15. Python学习—基础篇之基本数据类型(二)
  16. 11076: 小P的集合 位运算
  17. linux 服务器下的基本操作
  18. Redis防止重複請求鎖功能
  19. webstorm 2018.10月 License server 最新激活码
  20. 【转】Linux 高级的视角来查看Linux引导过程

热门文章

  1. python正则表达式判断素数【厉害了】
  2. 二、自动化测试平台搭建-搭建jango环境
  3. AAC编码学习
  4. Zathura: 轻巧好用的 PDF 查看器]
  5. 关于阿里ICON矢量图(SVG)上传问题.
  6. Nuxt.js 从入门到放弃
  7. Java 基础 JRE和JDK的区别
  8. 原生js的联动全选
  9. Chrome 启动全屏,并可以F11退出
  10. javascript函数传值问题(传值?址)