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 相关文章推荐
关于图片验证码设计的思考
Jan 29 Javascript
XHTML下,JS浮动代码失效的问题
Nov 12 Javascript
高性能web开发 如何加载JS,JS应该放在什么位置?
May 14 Javascript
js创建对象的区别示例介绍
Jul 24 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
Aug 18 Javascript
jQuery复合事件用法示例
Jun 10 jQuery
JS实现留言板功能
Jun 17 Javascript
vue项目打包部署到服务器的方法示例
Aug 27 Javascript
js实现多张图片每隔一秒切换一张图片
Jul 29 Javascript
mui js控制开关状态、修改switch开关的值方法
Sep 03 Javascript
Vuejs通过拖动改变元素宽度实现自适应
Sep 02 Javascript
JavaScript前端面试扁平数据转tree与tree数据扁平化
Jun 14 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
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
php内嵌函数用法实例
2015/03/20 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
解决JS无法调用Controller问题的方法
2015/12/31 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
jQuery 常用代码集锦(必看篇)
2016/05/16 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
jQuery实现下拉框多选 jquery-multiselect 的实例代码
2016/07/14 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
2017/03/04 Javascript
AngularJS改变元素显示状态
2017/04/20 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
2018/01/30 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
2019/01/24 Javascript
详解Node.js一行命令上传本地文件到服务器
2019/04/22 Javascript
js实现拖拽与碰撞检测
2020/09/18 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
Python实现从百度API获取天气的方法
2015/03/11 Python
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
python3音乐播放器简单实现代码
2020/04/20 Python
浅谈Python实现Apriori算法介绍
2017/12/20 Python
Python函数的定义方式与函数参数问题实例分析
2019/12/26 Python
Python基于httpx模块实现发送请求
2020/07/07 Python
css3利用transform变形结合事件完成扇形导航
2020/10/26 HTML / CSS
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
比利时香水网上商店:NOTINO
2018/03/28 全球购物
UNDONE手表官网:世界领先的定制手表品牌
2018/11/13 全球购物
上课迟到检讨书100字
2014/01/11 职场文书
安全生产承诺书
2014/03/26 职场文书
安全标兵事迹材料
2014/08/17 职场文书
初中学校对照检查材料
2014/08/19 职场文书
入团申请书格式
2019/06/20 职场文书
Java 语言中Object 类和System 类详解
2021/07/07 Java/Android
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python