1.前言

Javascript也算用了挺久了,为了得到一个变量,类似Java的静态变量的功能,我想到了很早以前学习JS的闭包,还有做俄罗斯方块的排行榜用到LocalStorage技术,所以想总结一下,分享给大家,也算是作为笔记记载了。

2.代码

<!DOCTYPE html>
<html>
<head>
<title>JS Counter Test</title>
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript"> $().ready(function(){ //*************counter0*************//
function counter0(){
var num = 0;
// function (), it was the same.
return function plus(){
return num ++;
}
//plus();
};
         //执行counter0时,里面的return,直接返回了其内容 ,并没有执行plus方法,此案例用来对比,满足好奇心。
$('#b0').click(function(){
$('#c0').html("Num0="+counter0());
});
//*************counter1*************//
function counter1(){
var num = 0;
function plus(){
return num ++;
}
plus();
return num;
};
          //和counter0比较,执行了plus方法,这个就是闭包的前身了,但是每次调用counter1,plus只能执行一次,所以每次值都是1
$('#b1').click(function(){
$('#c1').html("Num0="+counter1());
});
//*************counter2*************//
var c2 = (function counter2(){
var num = 0;
return function (){
return num ++;
} })();
          //闭包的正确玩法,方法里面写一个匿名方法或者有名称的方法都行
$('#b2').click(function(){
$('#c2').html("Num2="+c2());
}); //*************counter3*************//
var c3 = (function counter3(){
var num = 0;
return function plus(){
return num ++;
} })();
          //闭包里面方法可以匿名也可以有名称
$('#b3').click(function(){
$('#c3').html("Num3="+c3());
}); //*************counter4*************//
        //使用Html5本地存储技术,只要不要关了浏览器,即Session一直存在,就可以保存变量,刷新页面也存在
function counter4(){
if(typeof(Storage)!=="undefined"){
var num = localStorage.getItem("pageviews");
if (num != null){
localStorage.setItem("pageviews", Number(num) + 1);
}else{
localStorage.setItem("pageviews", 1);
num = 1;
}
$('#c4').html("Num4="+num);
}else{
$('#c4').html("Sorry, Your browser is unable to support web storage");
}
} $('#b4').click(function(){
counter4();
}); $('#reset4').click(function(){
localStorage.clear();
$('#c4').html("Num4=0");
}); //refresh will exeute every time.
counter4(); }); </script>
</head>
<body>
<h3>JS Counter</h3>
<button id="b0">Click Btn0</button>
<div id="c0">line zero</div>
<button id="b1">Click Btn1</button>
<div id="c1">line one</div>
<button id="b2">Click Btn2</button>
<div id="c2">line two</div>
<button id="b3">Click Btn3</button>
<div id="c3">line three</div>
<button id="b4">Click Btn4</button>  <button id="reset4">Rest Num4</button>
<div id="c4"></div>
</body>
</html>

闭包:有权访问另一个函数作用域内变量的函数都是闭包。

例如上面例子中counter方法里面的匿名或者有名称的方法。那你也许有疑惑,为啥后面调用counter2中num值是有记忆的呢?因为如果没有内部方法,使用了num变量,使得counter2方法使用完,变量num要被回收,但是又被另一个函数使用,即变量被引用,所以不会被回收了,因此可以利用这个特性来封装一个私有变量。

3.结果图

3.1初始化时的界面

3.2各自点击一次button

说明:Num2和Num3都是0的原因在于return num++; 是返回num +1前的num值,故此处为0。.

3.3前三个button各自点击3下,Btn3点击4下,Btn4点击6下。

4.结束语

闭包当然还可以使得对象中变量变成私有变量。

  

[学习笔记]JS计数器,闭包和localStorage的更多相关文章

  1. [学习笔记]JS中闭包的理解

    一.闭包概念的理解 闭包,又称为词法闭包或函数闭包指引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外. 自由变量:该变量既不是函数本身定义的也不是函数 ...

  2. amazeui学习笔记--js插件(UI增强)--警告框Alert

    amazeui学习笔记--js插件(UI增强)--警告框Alert 一.总结 1.警告框基本样式:用am-alert声明div容器, <div class="am-alert" ...

  3. amazeui学习笔记--js插件(UI增强4)--下拉组件Dropdown

    amazeui学习笔记--js插件(UI增强4)--下拉组件Dropdown 一.总结 1.am-dropdown(及其孩子):控制下拉列表的样式 2.data-am-dropdown(及其孩子):控 ...

  4. amazeui学习笔记--js插件(UI增强3)--折叠面板Collapse

    amazeui学习笔记--js插件(UI增强3)--折叠面板Collapse 一.总结 注意点: 1.data-am-collapse:这个东西就是展开折叠事件 2.am-collapse(包括其下属 ...

  5. amazeui学习笔记--js插件(UI增强2)--按钮交互Button

    amazeui学习笔记--js插件(UI增强2)--按钮交互Button 一.总结 1.按钮loading状态: <button type="button" class=&q ...

  6. 前端学习:学习笔记(JS部分)

    前端学习:学习笔记(JS部分) 前端学习:JS学习总结(图解)    JS的简介 JS基本语法 JS内置对象 JS的函数 JS的事件 JS的BOM JS的DOM JS的简介 新建步骤 <body ...

  7. JavaScript学习笔记——JS中的变量复制、参数传递和作用域链

    今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习.今天学习笔记主要有这样几个关键字:变量.参数传递.执 ...

  8. [学习笔记]JS 数组Array push相关问题

    前言: 今天用写了一个二维数组,都赋值为零,然后更新其中一个值,结果和预期是不一样,会整列的相同位置都是同一个值. 1.用Chrome的控制台样例如下: arrs[2][2] =1的赋值,竟然是三个数 ...

  9. js学习笔记—转载(闭包问题)

    ---恢复内容开始--- 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.     一.变量的作用域 要理解闭包,首先必须理解Javascrip ...

随机推荐

  1. java基础题整理(1)

    1.使用length属性获取数组长度,使用length()获取字符串的长度: 2.public.private.protected.friendly区别 public表明该数据成员.成员函数是对所有用 ...

  2. configParse模块(二十七)

    configparser用于处理特定格式的文件,其本质上是利用open来操作文件. # 注释1 ; 注释2 [section1] # 节点 k1 = v1 # 值 k2:v2 # 值 [section ...

  3. 函数式编程(九)——map,filter,reduce

    编程方法论: 面向过程:按照一个固定的流程去模拟解决问题的流程 函数式:编程语言定义的函数 + 数学意义的函数 y = 2*x + 1 函数用编程语言实现 def fun(x): return 2*x ...

  4. 定义get/set方法快捷方式

    定义get/set方法可以通过鼠标进行完成,这里有一个简单的通过编辑器默认生成getter/setter,编辑器会生成默认生成get/set方法 第一步:右键鼠标,如图所示选择 第二步:点击OK就可以 ...

  5. 不跳转修改url(history.pushState)

    有时候我们会想不跳转的情况下修改url 直接上代码吧: history.pushState(null,"","?test=123") 值得注意的是,为了用户安全 ...

  6. LVM基本概念及工作原理

    LVM基本概念及工作原理 背景知识: 一直困惑于LVM,特地找资料查了查,终于对LVM的概念和工作原理有了深入的理解.接下来记录下.新的技术出来必定是为了改变现有的不足,所以LVM的出现是由于对现有磁 ...

  7. Hadoop生态圈-使用Ganglia监控flume中间件

    Hadoop生态圈-使用Ganglia监控flume中间件 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Ganglia监控简介 加州伯克利大学千禧计划的其中一个开源项目.是一 ...

  8. JavaSE学习总结(九)—— Java访问数据库(JDBC)

    一.JDBC简介 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java ...

  9. maven中经常使用的插件

    tomcat插件:非常实用,特点就是不用配置tomcat,可以任意修改端口号. <plugin> <groupId>org.apache.tomcat.maven</gr ...

  10. 在 chrome 上导出 pdf

    用html+css写出网页,然后在chrome上导出pdf 1. command + p:快捷呼出打印: 2. “目标打印机”:选择“更改”,之后选择“另存为PDF”: 3. 点“更多设置”,可以勾选 ...