js闭包学习心得总结


Posted in Javascript onApril 17, 2018

首先引用来自官网文档的定义:

closure is the combination of a function and the lexical environment within which that function was declared.

闭包是一个函数和其内部公开变量的环境的集合.

简单而言, 闭包 = 函数 + 环境

第一个闭包的例子

function init() {
 var name = 'Mozilla'; // name is a local variable created by init
 function displayName() { // displayName() is the inner function, a closure
 alert(name); // use variable declared in the parent function 
 }
 displayName(); 
}
init();

because inner functions have access to the variables of outer functions, displayName() can access the variable name declared in the parent function, init().

其实这个栗子很简单,displayName()就是init()内部的闭包函数,而为啥在displayName内部可以调用到外部定义的变量 name 呢,因为js内部函数有获取外部函数中变量的权限。

第二个例子

var data = [
 {'key':0},
 {'key':1},
 {'key':2}
];
function showKey() {
 for(var i=0;i<data.length;i++) {
   setTimeout(function(){
    //console.log(i); //发现i输出了3次3
   //console.log(this); // 发现 this 指向的是 Window
   data[i].key = data[i].key + 10;
   console.log(data[i].key)
   }, 1000);
 }
}
showKey();

上面这个例子可以正确输出 10 11 12 吗?

答案是:并不能,并且还会报语法错误....

console.log(i); 发现i输出了3次3,也就是说,在setTimeout 1000毫秒之后,执行闭包函数的时候,for循环已经执行结束了,i是固定值,并没有实现我们期望的效果。

console.log(this); 发现 this 指向的是 Window,也就是说,在函数内部实现的闭包函数已经被转变成了全局函数,存储到了内存中。

所以需要再定义一个执行函数

var data = [
 {'key':0},
 {'key':1},
 {'key':2}
];
function showKey() {
 var f1 = function(n){
  data[i].key = data[i].key + 10;
  console.log(data[i].key)
 }
 for(var i=0;i<data.length;i++) {
   setTimeout(f1(i), 1000);
 }
}
showKey();
// 得到预期的 10 11 12
Javascript 相关文章推荐
jquery如何扑捉回车键触发的事件
Apr 24 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
Nov 19 Javascript
jQuery实现鼠标滑过Div层背景变颜色的方法
Feb 17 Javascript
javascript制作2048游戏
Mar 30 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
Aug 24 Javascript
浅谈JS运算符&amp;&amp;和|| 及其优先级
Aug 10 Javascript
AngularJS自定义指令实现面包屑功能完整实例
May 17 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
Jul 13 Javascript
13 个npm 快速开发技巧(推荐)
Jul 04 Javascript
vue实现在线翻译功能
Sep 27 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
Jun 22 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
Sep 04 Javascript
Vue使用json-server进行后端数据模拟功能
Apr 17 #Javascript
js实现点击按钮复制文本功能
Jul 20 #Javascript
Element-UI Table组件上添加列拖拽效果实现方法
Apr 14 #Javascript
React中的render何时执行过程
Apr 13 #Javascript
全站最详细的Vuex教程
Apr 13 #Javascript
vue的常用组件操作方法应用分析
Apr 13 #Javascript
简单的vuex 的使用案例笔记
Apr 13 #Javascript
You might like
ThinkPHP独立分组使用的注意事项
2014/11/25 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
2017/07/19 PHP
PHP使用Http Post请求发送Json对象数据代码解析
2020/07/16 PHP
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
js字符串引用的两种方式(必看)
2016/09/18 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
基于Vue实现timepicker
2017/04/25 Javascript
使用Node.js实现RESTful API的示例
2017/08/01 Javascript
Angular5.1新功能分享
2017/12/21 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
2018/06/25 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
关于vue里页面的缓存详解
2019/11/04 Javascript
浅谈vue使用axios的回调函数中this不指向vue实例,为undefined
2020/09/21 Javascript
35个Python编程小技巧
2014/04/01 Python
Python解析json文件相关知识学习
2016/03/01 Python
利用aardio给python编写图形界面
2017/08/21 Python
详解python eval函数的妙用
2017/11/16 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
python 拼接文件路径的方法
2018/10/23 Python
Python使用matplotlib 画矩形的三种方式分析
2019/10/31 Python
使用PyOpenGL绘制三维坐标系实例
2019/12/24 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
Python常见反爬虫机制解决方案
2020/06/01 Python
css实例教程 一款纯css3实现的超炫动画背画特效
2014/11/05 HTML / CSS
CSS3绘制六边形的简单实现
2016/08/25 HTML / CSS
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
专业毕业生个性的自我评价
2013/10/03 职场文书
超市开业庆典活动策划方案
2014/09/15 职场文书
小学运动会报道稿
2015/07/22 职场文书
九不准学习心得体会
2016/01/23 职场文书
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android