本文实例讲述了JS闭包用法。分享给大家供大家参考,具体如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
// 第一,函数作为返回值
function fn(){
var max = 10;
return function bar(x){
if(x > max) {
console.log(x);
}
};
}
var f1 = fn();
f1(15);
</script>
<script type="text/javascript">
// 第二,函数作为参数被传递
var max = 10;
fn = function(x){
if(x > max){
console.log(x);//15
}
};
(function(f){
var max = 100;
f(15);
})(fn);
</script>
<script>
function fn(){
var max = 10;
return function bar(x){
if(if > max){
console.log(x);
}
};
}
var f1 = fn();
max = 100;
f1(15);
</script>
</body>
</html>
第一步,代码执行前生*局上下文环境,并在执行时对其中的变量进行赋值。此时全局上下文环境是活动状态。
全局上下文环境:max是undefined
第二步,执行var f1 = fn();代码时,调用fn(),产生fn()执行上下文环境,压栈,并设置为活动状态。
fn()上下文环境:max是10
第三步,执行完var f1 = fn();,fn()调用完成。按理说应该销毁掉fn()的执行上下文环境,但是这里不能这么做。
注意,重点来了:因为执行fn()时,返回的是一个函数。函数的特别之处在于可以创建一个独立的作用域。
而正巧合的是,返回的这个函数体中,还有一个自由变量max要引用fn作用域下的fn()上下文环境中的max。
因此,这个max不能被销毁,销毁了之后bar函数中的max就找不到值了。因此,这里的fn()上下文环境不能被销毁,还依然存在与执行上下文栈中。
执行到max = 100;时,全局上下文环境将变为活动状态,但是fn()上下文环境依然会在执行上下文栈中。
另外,执行完max = 100;,全局上下文环境中的max被赋值为100。
全局上下文环境:max是100 fn()上下文环境:max是10
第四步,执行到f1(15);,执行f1(15),即执行bar(15),创建bar(15)上下文环境,并将其设置为活动状态。
执行bar(15)时,max是自由变量,需要向创建bar函数的作用域中查找,找到了max的值为10。
这里的重点就在于,创建bar函数是在执行fn()时创建的。fn()早就执行结束了,但是fn()执行上下文环境还存在与栈中,因此bar(15)时,max可以查找到。如果fn()上下文环境销毁了,那么max就找不到了。
使用闭包会增加内容开销,现在很明显了吧!
第五步,执行完f1(15);就是上下文环境的销毁过程,这里就不再赘述了。
闭包和作用域、上下文环境有着密不可分的关系,真的是“想说爱你不容易”!
另外,闭包在jQuery中的应用非常多,无论你是想了解一个经典的框架/类库,还是想自己开发一个插件或者类库,像闭包、原型这些基本的理论,是一定要知道的。否则,到时候出了BUG你都不知道为什么,因为这些BUG可能完全在你的知识范围之外。
更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript中json操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。
# JS
# 闭包
# 通俗易懂地解释JS中的闭包
# JS继承与闭包及JS实现继承的三种方式
# 浅谈JavaScript作用域和闭包
# JS闭包的几种常见形式实例详解
# JS实现闭包中的沙箱模式示例
# JavaScript闭包的简单应用
# 通过示例彻底搞懂js闭包
# JavaScript闭包和回调详解
# 浅谈JS封闭函数、闭包、内置对象
# JavaScript闭包_动力节点Java学院整理
# 深入理解Javascript中的作用域链和闭包
# JS闭包可被利用的常见场景小结
# 利用js的闭包原理做对象封装及调用方法
# javascript闭包功能与用法实例分析
# JavaScript中闭包的详解
# 图解Javascript——作用域、作用域链、闭包
# 轻松理解JavaScript闭包
# js中的闭包学习心得
# 的是
# 在与
# 设置为
# 值为
# 就找
# 类库
# 是在
# 来了
# 你是
# 相关内容
# 出了
# 之处
# 遍历
# 会在
# 并在
# 你不
# 数据结构
# 给大家
# 想了
# 密不可分
相关文章:
Swift中switch语句区间和元组模式匹配
小程序网站制作需要准备什么资料,如何制作小程序?
郑州企业网站制作公司,郑州招聘网站有哪些?
*服务器网站为何频现安全漏洞?
如何快速搭建FTP站点实现文件共享?
制作农业网站的软件,比较好的农业网站推荐一下?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
视频网站制作教程,怎么样制作优酷网的小视频?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
如何使用Golang table-driven基准测试_多组数据测量函数效率
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
定制建站如何定义?其核心优势是什么?
香港服务器如何优化才能显著提升网站加载速度?
存储型VPS适合搭建中小型网站吗?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
建站之星如何配置系统实现高效建站?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
如何用花生壳三步快速搭建专属网站?
如何用PHP快速搭建高效网站?分步指南
如何在香港免费服务器上快速搭建网站?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
css网站制作参考文献有哪些,易聊怎么注册?
建站之星伪静态规则如何设置?
Python lxml的etree和ElementTree有什么区别
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
如何在Windows虚拟主机上快速搭建网站?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
Python如何创建带属性的XML节点
如何在云指建站中生成FTP站点?
微信小程序 input输入框控件详解及实例(多种示例)
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
如何在IIS服务器上快速部署高效网站?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
小型网站建站如何选择虚拟主机?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
如何快速搭建高效香港服务器网站?
制作网站的基本流程,设计网站的软件是什么?
湖北网站制作公司有哪些,湖北清能集团官网?
,柠檬视频怎样兑换vip?
做企业网站制作流程,企业网站制作基本流程有哪些?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
Java解压缩zip - 解压缩多个文件或文件夹实例
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
制作网站的软件免费下载,免费制作app哪个平台好?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
*请认真填写需求信息,我们会在24小时内与您取得联系。