闭包使用场景:
1.函数作为返回值,如下场景

 function F1(){
var a = 100 //自由变量
//返回一个函数(函数作为返回值)
return function(){
console.log(a) //a是定义的时候 的作用域,不是执行的时候的作用域,为100
}
}
//f1得到一个函数
var f1 = F1()
var a = 200 //全局作用域,不影响函数内作用域
f1()

2.函数作为参数传递

 function F1(){
var a = 100 //自由变量
return function(){
console.log(a) //自由变量,父作用域寻找
}
}
var f1 = F1()
function F2(fn){
var a =300
fn()
}
F2(f1) //输出100

3.实际开发中闭包的应用:
闭包实际应用中主要用于封装变量,收敛权限

 function isFirstLoad(){
var _list = [] //放在函数内部,封装变量,使外部无法修改
return function (id){
if (_list.indexOf(id) >= 0){ //indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。如果要检索的字符串值没有出现,则该方法返回 -1。
return false
}else{
_list.push(id)
return true
}
}
} //使用
var firstLoad = isFirstLoad()
firstLoad(10) //true
firstLoad(10) //false
firstLoad(20) //true

实例:创建10个a标签,点击哪个弹出哪个数字

错误写法:

 //错误写法
var i,a
for( i = 0; i<10; i++){
a = document.createElement('a')
a.innerHTML=i+'<br/>'
a.addEventListener('click',function(e){
e.preventDefault() //preventDefault() 方法阻止元素发生默认的行为(例如,当点击提交按钮时阻止对表单的提交)。
alert(i) //i都是10,i是自由变量,要去父作用域(全局作用域)获取值,此时i已执行完,值为10
})
document.body.appendChild(a)
}

正确写法:

 var i
14 for( i = 0; i<10; i++){
15 (function(i){
16 var a = document.createElement('a')
17 a.innerHTML=i+'<br/>'
18 a.addEventListener('click',function(e){
19 e.preventDefault() //preventDefault() 方法阻止元素发生默认的行为(例如,当点击提交按钮时阻止对表单的提交)。
20 alert(i)
21 })
22 document.body.appendChild(a)
23 })(i) //创建一个自执行函数
24 }

最新文章

  1. LUA5.3的BNF范式学习笔记
  2. Js获取图片原始宽高
  3. java 枚举的常见使用方法
  4. Django基础 - Debug设置为False后静态文件获取404
  5. TCP协议中的三次握手和四次挥手(图解)(转载http://blog.csdn.net/whuslei/article/details/6667471)
  6. 【整理修订】Android.mk详解
  7. FFMPEG 截取RTMP直播流图片命令
  8. sql server 2008 在与 SQL Server 提示建立连接时出现与网络相关的或特定于实例的错误
  9. JavaScript计算加减乘除
  10. 3-51单片机WIFI学习(开发板8266底层源码介绍)
  11. Koa源码分析(一) -- generator
  12. Vue 实战项目开发流程
  13. asp.net 结合本地jQuery使在提交时显示错误提示
  14. Linux——进程管理简单学习笔记(二)
  15. Django自带的用户认证
  16. conn not captured
  17. Jmeter环境搭建
  18. arguments.length
  19. SQL Server UDF to pad a string
  20. ZeroMQ——一个轻量级的消息通信组件

热门文章

  1. The tag handler class for &quot;home.jsp&quot; (org.apache.taglibs.standard.tag.rt.core.ForEachTag) was not found on the Java Build Path
  2. OSX 10.11.1 预览照片绿屏的问题
  3. 修复 Xcode 错误 “The identity used to sign the executable is no longer valid”
  4. hihocoder 1049 后序遍历树
  5. 转载:Java就业企业面试问题-电商项目
  6. 在linux里建立一个快捷方式,连接到另一个目录
  7. BZOJ3110:[ZJOI2013]K大数查询(整体二分版)
  8. BZOJ3403:[USACO2009OPEN]Cow Line
  9. Python 函数之装饰器
  10. jQuery中 :first、:first-child 和 :first-of-type 之间的不同