JavaScript 中级笔记 第四章 闭包
发布时间:2024-04-18 10:53:09
标签:JavaScript,中级笔记,闭包
5,闭包
闭包意味着内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止。
让我们先来看一个闭包的例子。
<script type="text/javascript"> function add(num){ return function(toAdd){ return num+toAdd; //代码① } } var addFive = add(5); //此时addFive为function(toAdd){return num+toAdd;} var count = addFive(3); //此时count为 num+toAdd alert(count);//8 </script>
代码①是处于函数内层,不过它可以使用外层的变量num。
闭合还能解决另一个常见的Js问题,全局变量的影响。
通过自动执行匿名函数组合闭包,便可把原本属于全局的变量隐藏起来。看下面的例子:
<script type="text/javascript"> (function(){ var msg = "Hello"; window.onunload = function(){ alert(msg);//输出Hello } })() //alert(msg);//出现未定义 </script>
在使用setTimeout时,我们经常也用上了闭包。
<html> <head> <title>demo</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript"> window.onload = function(){ var obj = document.getElementById("abc"); obj.style.border = "1px solid #000"; setTimeout(function(){ obj.style.color = "red"; },1000) function DeAlert(msg , time){ setTimeout( function(){ alert(msg); },time) } DeAlert("hello",2000); } </script> </head> <body> <div id="abc">CssRain</div> </body> </html>
以这种方式使用setTimeout(),可以避免一些问题。
当然使用闭包 也会带来一些问题。如下代码所示:
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>demo</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript"> window.onload = function(){ var ul = document.getElementById("abc"); var li = document.getElementsByTagName("li"); for(var i=0;i<li.length;i++){ li[i].onclick = function(){ alert("你单击的是第"+i+"个li。"); } } } </script> </head> <body> <ul id="abc"> <li>AAA</li> <li>BBB</li> <li>CCC</li> </ul> </body> </html>
单击li弹出的序号为 3 ,并不是正确的序号,它引用的值是最后一次的赋值。
我们可以使用下面代码来解决:
<script type="text/javascript"> window.onload = function(){ var ul = document.getElementById("abc"); var li = document.getElementsByTagName("li"); for(var i=0;i<li.length;i++){ (function(){ //使用一个自执行的匿名函数 来激发出作用域 var b = i ; //记住在这个作用域内的值 li[b].onclick = function(){ //使用刚才记住的值,变量b alert("你单击的是第"+b+"个li。"); } })() } } </script>
通过使用闭包对作用域的控制,从而符合了我们的要求。
上面的代码可以分解为:
<script type="text/javascript"> window.onload = function(){ var ul = document.getElementById("abc"); var li = document.getElementsByTagName("li"); function a(){ var b = 0 ; li[b].onclick = function(){ alert("你单击的是第"+b+"个li。"); } } function b(){ var b = 1 ; li[b].onclick = function(){ alert("你单击的是第"+b+"个li。"); } } function c(){ var b = 2 ; li[b].onclick = function(){ alert("你单击的是第"+b+"个li。"); } } a(); b(); c(); } </script>
闭包的概念不容易掌握,我也是花了大量时间和精力才理解。
6,小结
笔记(2),(3),(4)讲解了 JavaScript中的几个重要的内容,包括引用,函数重载,作用域,上下文对象和闭包。
引用的关键内容: 指针,数组引用,字符串引用,区别,传值,传址。
函数重载的关键内容: 参数的数量,参数的类型,arguments,伪数组,typeof,constructor,区别-字符串和对象。
作用域的关键内容: 函数划分,全局作用域,全局对象,window对象的属性,局部作用域,显式声明,隐式声明。
上下文对象的关键内容: this变量,call,apply,参数区别,数组。
闭包的关键内容: 内层函数,外层函数,变量,setTimeout,闭包问题,最后一次的赋值,闭包和作用域。


猜你喜欢
- 模块导入1.1 import导入模块所谓的模块其实就是一个外部的工具包,其中存在的其实就是Python文件,这些文件都实现了某种特定的功能,
- identity-card验证身份证号码的正确性,不能仅仅通过正则表达式来验证,我们都知道我国的身份证一共是18位,由十七位数字本体码和一位
- 线性逻辑回归本文用代码实现怎么利用sklearn来进行线性逻辑回归的计算,下面先来看看用到的数据。这是有两行特征的数据,然后第三行是数据的标
- 共享标签默认情况下,git push 命令并不会传送标签到远程仓库服务器上。在创建完标签后,你必须显式地(手动)推送标签到远程服务
- Object 类型的对象虽然有 toString 方法,但结果却是 [Object Object] 让人没法理解的字符。比如简单的对象:{n
- 是不是有这么一个场景,对外提供一堆数据或者是要返回给用户一个结果。但是不想把内部的一些数据和逻辑暴露给对方。。。简单点来说,就是想以服务的方
- 一同事反馈有一MySQL实例因为断电之后,启动不了。用了innodb_force_recovery=6也无效,于是前往查看。排查过程:最早的
- 本文实例讲述了python实现把二维列表变为一维列表的方法。分享给大家供大家参考,具体如下:c = [[1,2,3], [4,5,6], [
- 内容摘要:asp使用最多的就是ACCESS数据库和ms sql server数据库,本文列出了asp连接这两个数据库的方
- 这里先解释一下几个概念 - 位置参数:按位置设置的参数,隐式用元组保存对应形参.平时我们用的大多数是按位置传参.比如有函数def func(
- 本文以Python3.8为例1、 compileall py文件转换为pyc1.1、compileall命令行模式不需要额外安装,pytho
- 数据加密是一种保护数据安全的技术,通过对数据进行编码,使得未经授权的用户无法读取或改动数据。加密是通过使用加密算法和密钥实现的。加密算法是一
- 一、简介我们知道在购买股票的时候,可以使用历史数据来对当前的股票的走势进行预测,这就需要对股票的数据进行获取并且进行一定的分析,当然了,人们
- 规则:open(file_name[,access_mode][,buffering])参数说明file_name:、文件路径+文件名称,加
- text函数的功能是向数据点添加文本说明。语法text(x,y,txt)text(x,y,z,txt)text(___,Name,Value
- 本文实例讲述了Python实现获取磁盘剩余空间的2种方法。分享给大家供大家参考,具体如下:方法1:import ctypesimport o
- 什么是fixture根据pytest官方文档的说明,fixture可以简单的归纳为具有以下功能的函数:配置测试前系统的初始状态;定义传入测试
- 平常需要怎么做来维护数据库吗?1. 允许收缩数据库中的每个文件以删除未使用的页。数据和事务日志文件都可以收缩。数据库文件可以作为组或单独地进
- 这篇文章主要介绍了python构造函数init实例方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 介绍Prometheus 的基本原理是通过 HTTP 周期性抓取被监控组件的状态。任意组件只要提供对应的 HTTP 接口并且符合 Prome