前面已经讲解了 引用,函数重载,作用域和上下文,接下来,讲解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,闭包问题,最后一次的赋值,闭包和作用域。
分享到:
相关推荐
JavaScript中的作用域和上下文对象是理解这门语言的关键概念,尤其对于中高级开发者来说更是如此。作用域决定了变量的可见性和生命周期,而上下文对象则关乎函数执行时的环境。 首先,我们要明白JavaScript的作用域...
### JavaScript中级知识点详解 #### 一、回顾:DOM与事件 **1. DOM (文档对象模型)** DOM 是一种标准的编程接口,用于处理 HTML 和 XML 文档。它定义了如何通过编程方式访问文档结构、内容以及样式。在 Web 开发...
JavaScript 中级笔记第五章面向对象的基础主要涵盖了对象的创建、使用、公共方法、私有方法以及特权方法等核心概念。面向对象编程是JavaScript中的重要特性,理解和掌握这些知识点对于提升编程能力至关重要。 1. **...
在JavaScript的中级学习中,掌握闭包的概念是理解高级编程技巧的基础。闭包的特性包括能够记忆并访问函数定义时所在的词法作用域。 在给出的文件内容中,闭包被描述为“内层的函数可以引用存在于包围它的函数内的...
Java中级笔记涵盖了多个关键的Web开发技术,包括Servlet、JSP、分页和Ajax。这些技术在构建动态、交互式的Web应用程序中起着至关重要的作用。 1. **Servlet**:Servlet是Java EE平台中的核心组件,它是一个Java类,...
1,引用 引用是一个指向对象实际位置的指针。看下面的使用引用的例子: [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 本例中,两个对象都指向同一个对象,当修改某一个对象的属性内容时,则会影响另一个。...
这个名为"JavaScript 基础和中级 代码汇总.zip"的压缩包文件显然是一个JavaScript学习者或开发者积累的实践代码集合,旨在帮助理解和巩固从基础到中级的JavaScript知识。 首先,我们来看看JavaScript的基础部分。...
#### Java EE中级部分 - **Servlets**:处理HTTP请求的基本组件。 - **JSP (JavaServer Pages)**:动态网页技术,与HTML结合展示动态内容。 - **MVC (Model-View-Controller)**:设计模式,用于分离数据模型、用户...
JavaWeb笔记.pdf提供了JavaWeb开发的详细知识点,涵盖了基础知识、高级技术、开发框架、安全、性能优化、项目实践、开发工具、面试常见问题等方面,非常适合JavaWeb开发初学者和中级开发者阅读。
JavaScript是一种广泛使用的编程语言,尤其在网络开发中占据核心地位。它是一种动态类型的、解释型的、弱类型的脚本语言,主要用于客户端的网页交互,但也可以在服务器端通过Node.js环境运行。JavaScript的主要特点...
常见的编程语言可以分为编译型语言(如C++、Java等)和解释型语言(如Python、JavaScript等)。了解它们之间的区别及适用场景有助于软件设计师在项目初期做出更合理的选型。 #### 语言处理工具 语言处理工具主要...
本笔记将详细探讨HTML的中级知识,旨在帮助开发者提升技能水平。 1. **语义化标签** 随着HTML5的引入,一系列语义化标签如, , , , 和等被引入,它们有助于提高页面结构的可读性和可访问性。了解并正确使用这些标签...
### Java学习笔记知识点详解 #### Java 平台与开发概述 - **Java平台分类:** - **J2SE(Java SE):** 标准版,适用于桌面应用程序开发。 - **J2EE(Java EE):** 企业版,专为Web应用和服务端应用程序设计。 -...
中级JS笔记 高级JS注释 现在使用JavaScript 互动课程:关闭或关闭 学习AngularJS-这样的列表,但重点是AngularJS。 网站/博客 特定JavaScript NodeHispano 费内特 它们包括JavaScript,但不是特定的 ...
布局永久链接默认/高级JavaScript教学大纲如果您是老师或对课程的设计感兴趣,请参阅...先决条件 ()或同等学历了解JavaScript中的变量,数据类型,控制流和基本功能用法精通HTML的中级知识,至少具有CSS的基础知识jQu