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 相关文章推荐
js和jquery批量绑定事件传参数一(新猪猪原创)
Jun 23 Javascript
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
Nov 15 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
Feb 19 Javascript
AngularJS教程 ng-style 指令简单示例
Aug 03 Javascript
BootStrap Validator使用注意事项(必看篇)
Sep 28 Javascript
Angularjs实现分页和分页算法的示例代码
Dec 23 Javascript
AngularJS使用拦截器实现的loading功能完整实例
May 17 Javascript
zTree异步加载展开第一级节点的实现方法
Sep 05 Javascript
Vue监听事件实现计数点击依次增加的方法
Sep 26 Javascript
JS使用队列对数组排列,基数排序算法示例
Mar 02 Javascript
vue 避免变量赋值后双向绑定的操作
Nov 07 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
Jan 20 Vue.js
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
《星际争霸II》全新指挥官斯台特曼现已上线
2020/03/08 星际争霸
英雄试炼之肉山谷—引领RPG新潮流
2020/04/20 DOTA
php通过strpos查找字符串出现位置的方法
2015/03/17 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
onpropertypchange
2006/07/01 Javascript
Javascript中Eval函数的使用说明
2008/10/11 Javascript
JavaScript 中的日期和时间及表示标准介绍
2013/08/21 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
2015/09/23 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
2016/09/17 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
vue集成kindeditor富文本的实现示例代码
2019/06/07 Javascript
Javascript异步编程async实现过程详解
2020/04/02 Javascript
JQuery实现折叠式菜单的详细代码
2020/06/03 jQuery
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
5款非常棒的Python工具
2018/01/05 Python
Python递归实现打印多重列表代码
2020/02/27 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
在Tensorflow中实现leakyRelu操作详解(高效)
2020/06/30 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
css3边框_动力节点Java学院整理
2017/07/11 HTML / CSS
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
师范生自荐信范文
2013/10/06 职场文书
四年级评语大全
2014/04/21 职场文书
公司担保书范文
2014/05/21 职场文书
2013年最新自荐信范文
2014/06/23 职场文书
2015年爱牙日活动总结
2015/02/05 职场文书
基层工作经历证明
2015/06/19 职场文书
初中班主任教育随笔
2015/08/15 职场文书
礼仪培训心得体会
2016/01/22 职场文书
如何使用vue3打造一个物料库
2021/05/08 Vue.js