摘要

闭包机制是JavaScript的重点和难点,本文希望能帮助大家轻松的学习闭包
一、什么是闭包?
闭包就是可以访问另一个函数作用域中变量的函数。
下面列举出常见的闭包实现方式,以例子讲解闭包概念
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
f1是f2的父函数,而f2被赋给了一个全局变量(return的值),这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收,这便形成了闭包。
因此,可以这么理解。闭包机制就是,如果A函数引用了另一个函数B的变量,但是B返回后A仍没有返回,仍存在,因为A的引用,所以B的所有局部变量并不会随B退出而注销,会一直存在,直到A注销。此时A就是闭包。
二、闭包的this指针
闭包通常在全局环境调用的,所以this通常指向window,具体情况还是需要视执行环境而言,总之this指向执行环境。
若需要闭包的this指向闭包的包含对象,则需要将包含对象的this作为变量传进闭包。
三、使用闭包的注意点
四、解决一道闭包常见面试题
问题:
function onMyLoad(){
/*
抛出问题:
此题的目的是想每次点击对应目标时弹出对应的数字下标 0~4,但实际是无论点击哪个目标都会弹出数字5
问题所在:
arr 中的每一项的 onclick 均为一个函数实例(Function 对象),这个函数实例也产生了一个闭包域,
这个闭包域引用了外部闭包域的变量,其 function scope 的 closure 对象有个名为 i 的引用,
外部闭包域的私有变量内容发生变化,内部闭包域得到的值自然会发生改变
*/
var arr = document.getElementsByTagName("p");
for(var i = 0; i < arr.length;i++){
arr[i].onclick = function(){
alert(i);
}
}
}
解决方法
1、在外面再加一层函数,将i作为函数参数传进来,这样每次保存的是函数内部的变量,与外部i不是同一个内存空间,而每次调用函数都会生成一个局部变量,所以可以保证每次保存的值互不影响。
for(var i = 0; i<arr.length;i++){
arr[i].onclick = (function(arg){
return function () {
alert(arg);
}
})(i);
}
2、用ES6新特let,将for循环的var i改成let i,这样当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量。你可能会问,如果每一轮循环的变量i都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本轮循环的值?这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# javascript闭包
# 通俗易懂地解释JS中的闭包
# JS继承与闭包及JS实现继承的三种方式
# 浅谈JavaScript作用域和闭包
# JS闭包的几种常见形式实例详解
# JS实现闭包中的沙箱模式示例
# JavaScript闭包的简单应用
# 通过示例彻底搞懂js闭包
# JavaScript闭包和回调详解
# 浅谈JS封闭函数、闭包、内置对象
# JavaScript闭包_动力节点Java学院整理
# 深入理解Javascript中的作用域链和闭包
# JS闭包可被利用的常见场景小结
# 利用js的闭包原理做对象封装及调用方法
# javascript闭包功能与用法实例分析
# JavaScript中闭包的详解
# JS闭包用法实例分析
# 图解Javascript——作用域、作用域链、闭包
# js中的闭包学习心得
# 都是
# 本轮
# 会在
# 弹出
# 解决方法
# 的是
# 就在
# 有个
# 基础上
# 均为
# 形成了
# 给了
# 希望能
# 只在
# 要将
# 你把
# 将不
# 这是因为
# 具体情况
# 再加
相关文章:
C++中引用和指针有什么区别?(代码说明)
全景视频制作网站有哪些,全景图怎么做成网页?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
建站之星如何快速更换网站模板?
如何通过远程VPS快速搭建个人网站?
如何在新浪SAE免费搭建个人博客?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
如何在云服务器上快速搭建个人网站?
如何在Windows 2008云服务器安全搭建网站?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
如何挑选最适合建站的高性能VPS主机?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
如何通过宝塔面板实现本地网站访问?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
建站之星如何保障用户数据免受黑客入侵?
制作网页的网站有哪些,电脑上怎么做网页?
建站之星安装路径如何正确选择及配置?
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
相册网站制作软件,图片上的网址怎么复制?
在线制作视频网站免费,都有哪些好的动漫网站?
建站之星图片链接生成指南:自助建站与智能设计教程
企业微网站怎么做,公司网站和公众号有什么区别?
如何制作算命网站,怎么注册算命网站?
建站主机是什么?如何选择适合的建站主机?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
建站VPS推荐:2025年高性能服务器配置指南
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
网站微信制作软件,如何制作微信链接?
如何用虚拟主机快速搭建网站?详细步骤解析
如何快速生成可下载的建站源码工具?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
制作销售网站教学视频,销售网站有哪些?
Swift开发中switch语句值绑定模式
如何通过WDCP绑定主域名及创建子域名站点?
微信小程序 input输入框控件详解及实例(多种示例)
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
实现虚拟支付需哪些建站技术支撑?
山东网站制作公司有哪些,山东大源集团官网?
建站主机如何选?高性价比方案全解析
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
建站主机与虚拟主机有何区别?如何选择最优方案?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
建站ABC备案流程中有哪些关键注意事项?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
*请认真填写需求信息,我们会在24小时内与您取得联系。