js高级-闭包
function foo(x){
var tmp = 3;
return function(y){ //把一个函数作为返回值,定义时候的作用域
console.log(x+y+(++tmp)) //++tmp先自加再参与表达式运算
}
}
var bar = foo(2) //此时bar指向了匿名函数,匿名函数又指向了 x,tmp两个变量 bar就是一个闭包(匿名函数加x,tmp两个父级变量)
bar(10) //16
bar(20) //27 此时函数执行完成后里面的变量没有回收掉 所以tmp还是4 然后++tmp就是5 x还是2 y就是20 (只要bar没有释放里面的变量就不会回收 。关闭浏览器才会释放)
function d(){
var a = 10;
console.log(a)
}
d(); //执行完成后 a会被回收 浏览器关闭函数会被回收 函数+引用的变量就会形成闭包
闭包的应用
匿名函数自执行
var t = function (a){ //污染全局 尽量不要定义全局变量
console.log(a)
}
t(9);
//尽量少的定义全局变量 例如 jQuery 只定义了 $,jQuery两个
;(function(a){
console.log(a)
})(3)
1、循环注册dom事件
<ul>
<li></li>
<li></li>
</ul>
var lis = document.querySelectorAll('li')
for(var i=0; i<lis.length; i++){
//典型错误
lis[i].onclick = function(){ //事件的方法执行是:当事件触发的时候执行 绑定事件只有点击才执行。 是异步的 当事件触发的时候 i的值为lengh长度了
console.log(i) //变量i是父函数里面的变量
}
//正确
(lis[i].onclick = function(a){ //做成自执行函数来注册事件
console.log(a)
})(i)
}
for(var i = 0; i< 10; i++){ //典型错误
setTimeOut(function(){
console.log(i)
},1000)
}
for(var i = 0; i< 10; i++){ //匿名自执行函数解决
(function(a){
setTimeout(function(){
console.log(a)
},1000)
})(i)
}
js高级-闭包的更多相关文章
- JS高级——闭包
		
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
 - JS高级——闭包练习
		
从上篇文章我们知道与浏览器的交互操作如鼠标点击,都会被放入任务队列中,而放入到任务队列中是必须等到主线程的任务都执行完之后才能执行,故而我们有时利用for循环给dom注册事件时候,难以获取for循环中 ...
 - JS高级---闭包小案例
		
闭包小案例 普通的函数 //普通的函数 function f1() { var num = 10; num++; return num; } console.log(f1()); //11 conso ...
 - 《Node.js 高级编程》简介与第二章笔记
		
<Node.js 高级编程> 作者简介 Pedro Teixerra 高产,开源项目程序员 Node 社区活跃成员,Node公司的创始人之一. 10岁开始编程,Visual Basic.C ...
 - 理解运用JS的闭包、高阶函数、柯里化
		
JS的闭包,是一个谈论得比较多的话题了,不过细细想来,有些人还是理不清闭包的概念定义以及相关的特性. 这里就整理一些,做个总结. 一.闭包 1. 闭包的概念 闭包与执行上下文.环境.作用域息息相关 执 ...
 - js高级-面向对象继承
		
一.工厂模式创建对象及优缺点 继承就是把公共的部分抽象出来作为父类,基类.吃饭,跑步等 var a = {}; //批量创建不方便,不能重复设置公共属性的代码 //工厂模式出现了,创建10个Cat对象 ...
 - [ JS 进阶 ] 闭包,作用域链,垃圾回收,内存泄露
		
原网址:https://segmentfault.com/a/1190000002778015 1. 什么是闭包? 来看一些关于闭包的定义: 闭包是指有权访问另一个函数作用域中变量的函数 --< ...
 - js高级---js架构
		
ECMAScript1997 年欧洲计算机制造商协会 39 号技术委员会制定了ECMA-262标准(别名 ECMAScript),而浏览器只是负责实现,ie浏览器实现的结果是jscript,远景浏览器 ...
 - JS的闭包、高阶函数、柯里化
		
本文原链接:https://cloud.tencent.com/developer/article/1326958 https://cloud.tencent.com/developer/articl ...
 
随机推荐
- 输入框占位符placeholder
			
占位符placeholder的益处不用多说,但是很不幸的是,在IE8之前的浏览器里是无法实现placeholder这一属性的,所以在需要兼容IE8之前的浏览器的情况下,我们不得不想办法模拟实现plac ...
 - tornado项目注意点
			
大体框架思想 如果你做的项目是偏向中小型的话,MTV或者MVC已经足够支撑起整个项目,而如果你做的项目比较大大话,或者说可能以后的业务量很大的话,那你就需要用到四层架构的思想了,那么我们就各自分析下俩 ...
 - Maven传递依懒
			
A依赖B,B依赖C.B是A的直接依赖,C是A的传递依赖. 1.Maven自己调解原则 先定义者优级先原则,谁先定义就用谁的传递依赖. 路径近者优级先原则,直接依赖级别高高于传递依赖. 2.排除依懒 & ...
 - python中的center
			
center(self,width,fillchar=None)让字符串居中显示,width定义字长度,fillchar定义空白处填充,不填写默认为空白 举个列子: 1 a = "hello ...
 - 02.photoshop制作透明图片步骤
			
1.首先打开PS软件和图片如下.文件-新建. 2.如下图背景内容选择-透明.在确定. 3.出现了白底这就是透明的. 4.将图片背景都去除 5.在选择文件-存储为 6.格式选择.GIF的文件.其它不是透 ...
 - android stuido的代码排版的快捷建CTRL+ALT+L
			
CTRL+ALT+L 需要主要留意的地方是QQ的与其冲突的 我将qq的中快捷方式给去除
 - 异常+远程控制Linux-14
			
什么是异常 a=8950/0 ZeroDivisioonError: division by zero print (a) ************** b = [1,2] ...
 - VirtualBox配置
			
安装增强工具:http://mikemainguy.blogspot.jp/2015/03/installing-virtualbox-guest-additions.html 安装ssh:https ...
 - linux下通过sed命令直接修改文件内容
			
sed是实现对流的编辑.通常,我们使用sed可以实现内容的编辑后然后保存成另外的一个文件,如果正确的话,才写入到源文件.但是某些时候,我们需要直接修改文件,因为,保存文件到一个文件,然后再覆盖原文件的 ...
 - HTTP 错误 403.6 - Forbidden 解决方案
			
MSDN 的解决方案 原因 1 Ip 安全的 XML 元素的allowUnlisted属性的值为 false.此外,客户端计算机的 IP 地址不在ip 安全XML 元素之下 IP 地址的列表中.IIS ...