首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
cmd
js
join
dagger
email
install
express
plugins
ascii
export
const
main
bit
command
netty
filter
sum
process
php
triggers
bitmap
range
audio
input
heap
format
actionscrip
hashtable
python2
controller
php7
go
httpclient
vbscript
char
include
shell
md5
flutter
split
request
timezone
require
search
hashcode
settings
hook
ip
bytecode
header
vba
get
javascript
merge
uri
tree
instance
golang
usb
loops
foreach
utf-8
dockerfile
future
c语言
node.js
copy
jar
spring
text
web
runtime
datetime
subset
yaml
rsa
iostream
jsp
schema
当前位置:
开发笔记
>
编程语言
> 正文
深入理解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
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
sum
深入解析JavaScript数组的创建与常用方法
JavaScript中的数组是数据集合的核心结构之一,内置了多种实用的方法。掌握这些方法不仅能提高开发效率,还能显著提升代码的质量和可读性。本文将详细介绍数组的创建方式及常见操作方法。 ...
[详细]
蜡笔小新 2024-12-21 12:06:37
php
JavaScript 中创建对象的多种方法
本文详细介绍了 JavaScript 中创建对象的几种常见方式,包括对象字面量、构造函数和 Object.create 方法,并提供了示例代码和属性描述符的解释。 ...
[详细]
蜡笔小新 2024-12-22 16:40:51
plugins
基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ...
[详细]
蜡笔小新 2024-12-22 15:31:28
audio
利用Selenium与ChromeDriver实现豆瓣网页全屏截图
本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ...
[详细]
蜡笔小新 2024-12-22 15:17:55
const
Redux入门指南
本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ...
[详细]
蜡笔小新 2024-12-22 10:04:31
format
云函数与数据库API实现增删查改的对比
本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ...
[详细]
蜡笔小新 2024-12-22 00:56:21
format
HTML5 Canvas 画板功能详解及实现方法
本文详细介绍如何使用 HTML5 和 JavaScript 实现一个交互式的画板功能。通过具体代码示例,帮助读者理解 Canvas API 的基本用法及其在绘图应用中的实际应用。 ...
[详细]
蜡笔小新 2024-12-21 22:01:01
heap
HDU 1536: S-Nim 游戏中的 SG 博弈分析
探讨 HDU 1536 题目,即 S-Nim 游戏的博弈策略。通过 SG 函数分析游戏胜负的关键,并介绍如何编程实现解决方案。 ...
[详细]
蜡笔小新 2024-12-21 18:26:33
format
如何在Kendo UI for jQuery中将行标题显示为可点击链接
本文详细介绍了如何在Kendo UI for jQuery的数据管理组件中,将行标题字段呈现为锚点(即可点击链接),帮助开发人员更高效地实现这一功能。通过具体的代码示例和解释,即使是新手也能轻松掌握。 ...
[详细]
蜡笔小新 2024-12-21 17:07:41
process
QGraphicsView - 如何禁用鼠标和键盘滚动 - QGraphicsView - how to disable mouse and keyboard scrolling
InmyapplicationIhaveQGraphicsScenewithpixmapaddedandallisviewedinQGraphicsViewwithsc ...
[详细]
蜡笔小新 2024-12-21 16:28:30
php
深入理解ExtJS:从入门到精通
本文详细介绍了ExtJS的功能及其在大型企业前端开发中的应用。通过实例和详细的文件结构解析,帮助初学者快速掌握ExtJS的核心概念,并提供实用技巧和最佳实践。 ...
[详细]
蜡笔小新 2024-12-21 15:41:04
js
Android WebView自适应布局与优化
本文详细介绍了如何在Android 4.4及以上版本中配置WebView以实现内容的自动高度调整和屏幕适配,确保中文显示正常,并提供代码示例。 ...
[详细]
蜡笔小新 2024-12-21 10:05:50
input
计算整数位数与基础编程示例
本文介绍了如何通过Java代码计算一个整数的位数,并展示了多个基础编程示例,包括求和、平均分计算、条件判断等。 ...
[详细]
蜡笔小新 2024-12-20 23:46:25
input
贪心与优先队列:最小化加法代价问题
本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ...
[详细]
蜡笔小新 2024-12-20 23:20:38
main
JSOI2010 蔬菜庆典:树结构中的无限大权值问题
本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ...
[详细]
蜡笔小新 2024-12-22 18:57:48
iwasafool
这个家伙很懒,什么也没留下!
Tags | 热门标签
cmd
js
join
dagger
email
install
express
plugins
ascii
export
const
main
bit
command
netty
filter
sum
process
php
triggers
bitmap
range
audio
input
heap
format
actionscrip
hashtable
python2
controller
RankList | 热门文章
1
分享两段简单的JS代码防止SQL注入_javascript技巧
2
JS代码防止SQL注入的方法(超简单)_javascript技巧
3
asp知识整理笔记3(问答模式)_javascript技巧-js教程-PHP中文网
4
thinkphp 表名 大小写 窍门_jquery
5
Nodejs Post请求报socket hang up错误的解决办法_node.js
6
js调用webservice中的方法实现思路及代码_javascript技巧-js教程-PHP中文网
7
js前台判断开始时间是否小于结束时间_jquery
8
DB.ASP 用Javascript写ASP很灵活很好用很easy_javascript技巧
9
ExtJS Grid使用SimpleStore、多选框的方法_extjs
10
ASP SQL防注入的方法_jquery
11
asp批量修改记录的代码_javascript技巧
12
用ASP将SQL搜索出来的内容导出为TXT的代码_javascript技巧
13
List the Stored Procedures in a SQL Server database_图象特效
14
Stop SQL Server_javascript技巧
15
用jscript启动sqlserver_javascript技巧
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有