【面向JS--闭包】
来源:互联网 发布:k线图 知乎 编辑:程序博客网 时间:2024/05/29 23:45
上一篇文章讲了局部变量与全局变量,我们来回顾一下。
全局变量 vs 局部变量全局变量:优:反复使用,且共享使用 缺:可能随时在任意位置被篡改——全局污染 建议:尽量避免使用全局变量局部变量:不可反复使用!方法调用完自动释放解决:闭包:反复使用一个局部变量,且不会被污染
可以看到,当我们希望即重用变量,又保护变量不被污染时,可以使用闭包,那什么是闭包?
闭包: 即重用变量,又保护变量不被污染的一种机制
如何使用闭包? 3步:
1、用外层函数包裹受保护的变量和操作变量的内层函数2、外层函数将内层函数返回3、使用者调用外层函数,获得内层函数的对象
缺点: 比一般函数占用更多内存
//模拟取号机//1、定义外层函数保护局部变量,并返回内部函数function factory(){ var n = 0; return function(){ return ++n; }}var ccb = factory();// 指向内部函数console.log(ccb());//1 执行函数,调用局部变量nconsole.log(ccb());//2n = 1;console.log(ccb());//3 不受污染var ccb1 = factory();// 重新定义一个函数,指向内部函数console.log(ccb1());//1 执行函数,调用局部变量nconsole.log(ccb1());//2
如何判断闭包?3特点:
1、内外层函数嵌套2、内层函数必须使用了外层函数的局部变量3、外层函数将内层函数返回到外部,可在外部调用
判断闭包结果:2句话:
1、外层函数调用了几次,就有几个受保护的局部变量副本2、同一次外层函数调用返回的内部函数对象,操作同一个变量
function outer(){ for(var i=0,arr=[];i<3;i++){ arr[i] = function(){return i;} } return arr;}var funs = outer();console.log(funs[0]());//?console.log(funs[1]());//?console.log(funs[2]());//?
解决思路:
1、先找受保护的变量,判断外层函数执行后变量的结果2、再找操作变量的内层函数: 1、被外层函数return到外部的 2、也可通过直接给全局变量赋值一个函数的方式
解析:
//i = 3,数组funs中的函数,全部指向i,则:console.log(funs[0]());//3console.log(funs[1]());//3console.log(funs[2]());//3
如何使 funs[0]()
输出0,funs[1]()
输出1?
//将 i 的值提前传进内部函数function outer(){ for(var i=0,arr=[];i<3;i++){ arr[i] = (function(i){ return function(){ return i; } }(i)) } return arr;}var funs = outer();console.log(funs[0]());//0console.log(funs[1]());//1console.log(funs[2]());//2
阅读全文
0 0
- 【面向JS--闭包】
- 【面向JS--闭包】
- js面向对象-闭包
- 【javascript】高级js--(面向对象js,arguments,闭包,自调)
- js - jquery闭包+js面向对象实例
- js_day17--js面向对象三大特征+闭包
- js 面向对象学习4 function 和闭包
- JS高级(作业域链,闭包,面向对象)
- 面向对象--闭包
- 02——js基本语法 js面向对象 闭包 数组
- js闭包的用途(匿名自执行函数,缓存,实现封装,实现面向对象)
- 带你一分钟理解闭包–js面向对象编程
- 一分钟带你理解闭包--js面向对象编程
- JS 之 (三)作用域链、闭包、面向对象
- 5js面向对象基础-闭包的概念及应用
- js面向对象编程指南学习笔记--闭包封装HTTP请求
- 【02】带你一分钟理解闭包--js面向对象编程
- javaScript 面向对象-闭包
- Python 正则表达式匹配字符串中的http链接
- gcov lcov 覆盖c/c++项目入门
- Zookeeper设置开机启动
- C++ 高性能服务器网络框架设计细节
- 数据蒋堂 | 从SQL语法看集合化
- 【面向JS--闭包】
- JAVA远程debug
- laravel的启动过程解析 服务容器Ioc
- UE4材质之图像处理
- linux信号量 signal
- hdu1080 Human Gene Functions【动态规划】
- 最小二乘法C实现
- 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)
- ConfigReader(十五)—— ReadGuideKillHeroTaskConfig