前言:

昨天写了一个关于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的内部类

js闭包vs Java内部类的更多相关文章

  1. js闭包与java内部类

    在js中闭包用的比较广泛,主要解决变量作用域导致的问题.

  2. Java内部类的使用小结

    转载:http://android.blog.51cto.com/268543/384844/ Java内部类的使用小结 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可 ...

  3. (转载)Java内部类的使用小结

    原文摘自:http://android.blog.51cto.com/268543/384844/   内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态stati ...

  4. 从字节码的角度看Java内部类与外部类的互相访问

    Java中non-static内部类为何可以访问外部类的变量?Java中外部类又为何可以访问内部类的private变量?这两个问题困扰过我一段时间,查了一些网上的答案,大多从“闭包”概念入手,理解起来 ...

  5. Android学习笔记_32_通过WebView实现JS代码与Java代码互相通信

    webview两种实现方法,覆盖onKeyDown()方法 缓存 WebSettings应用注意的几个问题 1.要实现JS代码与Java代码互相通信,需要通过Android的WebView控件,在视图 ...

  6. java内部类的一些看法

    java内部类, 我在看<thinking in java>的时候总感觉模棱两可的, 挣扎了好几天之后, 感觉有一部分的问题想的清楚了, 写一个随笔记录一下, 以备以后修改和查看 什么是内 ...

  7. JS前端加密JAVA后端解密详解

    最近有一个加解密的需求,其实没有什么难度,但是实践过程中踩了很多坑,把踩坑过程分享出来. 1.前端JS加密 /** * 加密(需要先加载aes.min.js文件) * @param word * @r ...

  8. Java内部类final语义实现

    本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...

  9. js闭包的作用域以及闭包案列的介绍:

    转载▼ 标签: it   js闭包的作用域以及闭包案列的介绍:   首先我们根据前面的介绍来分析js闭包有什么作用,他会给我们编程带来什么好处? 闭包是为了更方便我们在处理js函数的时候会遇到以下的几 ...

随机推荐

  1. brew本地安装包

    brew --cache # 输出本地缓存 一般位置 ~/Library/Caches/Homebrew # 将下载下来文件mv到缓存路径 download目录 # 重命名成没有下载下来的文件名 xx ...

  2. eclipse使用lombok简化java代码

    可以利用注解来代替getter.setter.toString.hashCode.构造方法等,简化代码开发. 具体用法 https://www.cnblogs.com/qnight/p/8997493 ...

  3. datatable 笔记 服务器端查询

    var vTable = ""; $("#vip_data").dataTable({ "scrollY": 400, //竖向高度 滚动 ...

  4. [转]webpack中require和import的区别

    webpack中可以写commonjs格式的require同步语法,可以写AMD格式的require回调语法,还有一个require.ensure,以及webpack自己定义的require.incl ...

  5. 1.3 正则表达式和python语言-1.3.8 创建字符集([ ])

    1.3.8 创建字符集([ ]) (2018-05-0815:24:00) 下面的示例将说明对于 r2d2|c3po 的限制将比[cr][23][dp][o2]更为严格 import re # 下面的 ...

  6. The First of my text

    JavaScript 学习第一天 一.属性可以动态拓展 例如: var person = { name : "zs"; age : 21; } person.sex = " ...

  7. python3.5.2库getpass

    getpass的功能是:允许隐式的输入字符串 import getpass _username='vigossr' _password='haha' username=input('username: ...

  8. JS中[object object]怎么取值

    错误信息:本来是要显示JSON对象的  结果控制台打印了[object object] 需要做一个简单的转换,如下: var jsonData = JSON.stringify(data);// 转成 ...

  9. 如何设置body高度为浏览器高度

    html{height:100%} body{min-height:100%} 有时我们的页面上内容不多,但设计师要求背景色必须铺满全屏,这时候只需在样式表中加上这行,body就以浏览器的高度显示,超 ...

  10. pyhton 监听文件输入实例

    def tail(filename): f = open(filename,encoding='utf-8') while True: line = f.readline() if line.stri ...