首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
fetch
bash
object
erlang
数组
dll
loops
search
heatmap
get
frameworks
golang
schema
httprequest
config
split
main
stream
jar
include
keyword
post
metadata
copy
solr
uml
bitmap
bytecode
eval
heap
tags
char
select
nodejs
random
text
rsa
buffer
export
const
substring
cSharp
process
hashcode
vbscript
instance
input
io
emoji
integer
audio
function
string
range
uri
list
foreach
utf-8
md5
install
datetime
spring
plugins
python
node.js
request
hashtable
email
less
case
cPlusPlus
regex
dagger
bit
cpython
testing
command
jsp
actionscrip
当前位置:
开发笔记
>
编程语言
> 正文
深入理解JavaScript的作用域链与闭包
作者:iwasafool | 来源:互联网 | 2024-12-23 01:27
本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。
### 深入理解Javascript的作用域链与闭包
#### 作用域(Scope)
在Javascript中,变量和函数的可用性受到其作用域的限制。作用域定义了变量和函数的有效范围,增强了程序的局部性和可靠性,减少了命名冲突。
- **全局作用域(Global Scope)**:在代码任何地方都能访问的对象拥有全局作用域。以下几种情况属于全局作用域:
- 最外层函数和最外层函数外部定义的变量。
- 未声明直接赋值的变量会自动成为全局变量。
- 所有`window`对象的属性。
```Javascript
var outSide = "outside";
function outFunction() {
var name = "inside";
function inSideFunction() {
alert(name);
}
inSideFunction();
}
alert(outSide); // 正确
outFunction(); // 正确
```
- **局部作用域(Local Scope)**:在函数内部定义的变量只能在该函数内访问。
```Javascript
function outFunction() {
var name = "inside name";
function inFunction() {
alert(name);
}
inFunction();
}
alert(name); // 错误
```
#### 作用域链(Scope Chain)
作用域链是Javascript引擎用于确定哪些数据可以被函数访问的一种机制。当一个函数创建时,它的作用域链会被初始化为创建此函数时可访问的所有对象。
例如,考虑以下函数:
```Javascript
function add(num1, num2) {
var sum = num1 + num2;
return sum;
}
```
在函数`add`创建时,其作用域链包含了一个全局对象,该对象包含了所有全局变量。
#### 执行上下文(Execution Context)
当函数执行时,Javascript会创建一个执行上下文(Execution Context),其中包含了函数运行所需的所有信息。执行上下文也有自己的作用域链,它从函数的作用域链初始化而来。
```Javascript
var total = add(5, 10);
```
#### 活动对象(Activation Object)
Javascript引擎还会创建一个活动对象(Activation Object),这个对象包含了函数运行期间的所有局部变量、参数以及`this`等变量。活动对象会被推入作用域链的前端,当执行上下文销毁时,活动对象也随之销毁。
#### 闭包(Closure)
闭包是指函数能够记住并访问其词法作用域的能力,即使该函数在其词法作用域之外执行。闭包是在函数创建时形成的,并且保留了对创建时作用域链的引用。
```Javascript
function newLoad() {
for (var i = 1; i <= 3; i++) {
document.getElementById('anchor' + i).Onclick= function () {
alert("you clicked anchor" + i);
};
}
}
```
在这个例子中,点击任何一个链接都会显示“you clicked anchor4”,因为所有的匿名函数都引用了同一个`i`变量,而`i`在循环结束后变成了4。
#### 闭包优化
为了避免上述问题,可以通过立即执行函数表达式(IIFE)来创建新的作用域,从而确保每个匿名函数都能正确引用对应的`i`值。
```Javascript
function newLoad() {
for (var i = 1; i <= 3; i++) {
(function (index) {
document.getElementById('anchor' + index).Onclick= function () {
alert("you clicked anchor" + index);
};
})(i);
}
}
```
通过这种方式,每个匿名函数都有自己独立的作用域,因此能正确地引用到对应的`i`值。
总结:
- 闭包是一个函数加上其创建时的作用域环境。
- 使用闭包可以保持对创建时状态的记忆。
- 闭包使得函数可以在其词法作用域之外访问其内部变量。
- 合理使用闭包可以避免常见的陷阱,如循环中的闭包问题。
android
asp.net
php
jsp
数据库
java
ip
windows
html
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
js
深入理解 Oracle 存储函数:计算员工年收入
本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ...
[详细]
蜡笔小新 2024-12-28 09:49:42
get
导航栏样式练习:项目实例解析
本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ...
[详细]
蜡笔小新 2024-12-27 19:42:28
post
新浪笔试题
1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ...
[详细]
蜡笔小新 2024-12-27 19:32:17
get
深入理解Cookie与Session会话管理
本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ...
[详细]
蜡笔小新 2024-12-27 18:20:43
copy
Linux 自动化安装脚本详解
本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ...
[详细]
蜡笔小新 2024-12-27 16:33:32
eval
分页插件3指定到某一页
前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ...
[详细]
蜡笔小新 2024-12-27 15:19:01
get
使用 NSTimer 实现倒计时功能
本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ...
[详细]
蜡笔小新 2024-12-26 19:08:19
include
次小生成树问题的高效求解
本文探讨了如何通过最小生成树(MST)来计算严格次小生成树。在处理过程中,需特别注意所有边权重相等的情况,以避免错误。我们首先构建最小生成树,然后枚举每条非树边,检查其是否能形成更优的次小生成树。 ...
[详细]
蜡笔小新 2024-12-28 13:42:43
include
QUIC协议:快速UDP互联网连接
QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ...
[详细]
蜡笔小新 2024-12-28 12:33:18
copy
编写有趣的VBScript恶作剧脚本
本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ...
[详细]
蜡笔小新 2024-12-28 09:46:23
get
技术分享:从动态网站提取站点密钥的解决方案
本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ...
[详细]
蜡笔小新 2024-12-28 04:11:47
jar
使用Windows批处理脚本监控并重启Java应用程序
本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ...
[详细]
蜡笔小新 2024-12-27 10:44:39
get
移动 UI 设计基础:打造简洁高效的用户界面
本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ...
[详细]
蜡笔小新 2024-12-27 08:43:40
copy
从 .NET 转 Java 的自学之路:IO 流基础篇
本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ...
[详细]
蜡笔小新 2024-12-26 17:37:25
copy
在Linux系统中配置并启动ActiveMQ
本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ...
[详细]
蜡笔小新 2024-12-27 14:38:54
iwasafool
这个家伙很懒,什么也没留下!
Tags | 热门标签
fetch
bash
object
erlang
数组
dll
loops
search
heatmap
get
frameworks
golang
schema
httprequest
config
split
main
stream
jar
include
keyword
post
metadata
copy
solr
uml
bitmap
bytecode
eval
heap
RankList | 热门文章
1
MySQL插入数据的四种方式及安全性分析
2
SpringBoot整合SpringSecurity+JWT实现单点登录
3
IT人生感悟:白天为生存,晚上为发展,工作热爱的表现,客户关系的重要性,为客户考虑的业务员,有效的培训课程,企业销售的层次,看世界的悲观态度
4
计算机等级考试与网络工程师考试的区别在哪里?
5
centos安装Mysql的方法及步骤详解
6
Oracle :修改数据库服务器字符集
7
win10待机后无法唤醒怎么办的解决方法
8
javascript和java的关系,JavaScript和java的关系
9
揭秘阿里云WAF背后神秘的AI智能防御体系
10
如何使用PHP代码将表格导出为UTF8格式的Excel文件
11
绿联五合一扩展坞:轻薄笔记本的刚需产品
12
Android自定义控件绘图篇之Paint函数大汇总
13
OkHttp3的基本使用及其特性
14
Java面经整理及相关概念解析
15
Explain如何助力SQL语句的优化及其分析方法
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有