Javascript闭包的作用与使用方法浅析
作者:上官孜然 发布时间:2024-04-10 16:12:11
js 闭包(closure)是Javascript语言的一个难点,也是它的特色。
闭包的作用:通过一系方法,将函数内部的变量(局部变量)转化为全局变量。
要理解闭包,首先必须理解Javascript特殊的变量作用域。
变量的作用域无非就是两种:全局变量和局部变量。
一、变量的作用域
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
var n =999;
function f1(){
alert(n);
}
f1(); // 999
另一方面,在函数外部无法读取函数内的局部变量。
function f1(){
var n=999;
}
alert(n); // error
这里有一个地方需要注意, 函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
function f1(){
n=999;
}
f1();
alert(n); // 999
二、如何从外部读取局部变量
出于种种原因,我们有时候需要得到函数内的局部变量。但是,正常情况下,这是办不到的,只有通过变通方法才能实现。那就是在函数的内部,再定义一个函数。
function f1(){
var n=999;
function f2(){
alert(n); // 999
}
}
在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。
但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。
所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!
function f1(){
var n = 999;
function f2(){
alert(n);
}
return f2;
}
var result = f1();
result(); // 999
以上的代码就是js中的闭包
在我的理解中,闭包就是能够读取其他函数内部变量的函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
来源:https://blog.csdn.net/Lynn_yu/article/details/127717364
猜你喜欢
- 什么是Urllib库Urllib是Python提供的一个用于操作URL的模块,我们爬取网页的时候,经常需要用到这个库。升级合并后,模块中的包
- 参考的一些文章以及论文我都会给大家分享出来 —— 链接就贴在原文,论文我上传到资源中去,大家可以免费下载学习,如果当天资源区找不到论文,那就
- 先说明一下,现在网上有一些功能很强大的动画类,如MOOFX之类,我为什么要写这三个动画函数?因为在写zDialog时需要且只需要用到透明度渐
- python map函数map()函数map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依
- 本文实例讲述了Python3中的真除和Floor除法用法。分享给大家供大家参考,具体如下:在Python3中,除法运算有两种,一种是真除,一
- python类class定义及其初始化定义类,功能,属性一般类名首字母大写class Calculator:#名字和价格是属性
- 1. 数据抽取的概念2. 数据的分类3. JSON数据概述及解析3.1 JSON数据格式3.2 解析库jsonjson模块是Python内置
- 问题你想重新加载已经加载的模块,因为你对其源码进行了修改。解决方案使用imp.reload()来重新加载先前加载的模块。举个例子:>&
- 本文只考虑模板中的字符串,不考虑字符串中带标签的情况。模板中的字符串文字不会自动转义,因为这里默认模板的作者已经正确书写模板的内容。{{ d
- 之前有文章,使用Android平台的OpenCV接入了视频,控制的目标是手机的摄像头,这是OpenCV的好处,使用OpenCV可以使用跨平台
- 一、假如训练集表现不好1.尝试新的激活函数ReLU:Rectified Linear Unit图像如下图所示:当z<0时,a = 0,
- 想要利用Python来操作word文档可以使用docx模块.安装: pip install python-docxfrom docx imp
- 将通过各种例子来了解如何在 Python 中使用 type() 函数。你好类型打印 "Hello World "几乎是你
- import socketimport re'''广东省 * 厅出入境政务服务网护照,通行证办理进度查询。分析网址格式
- 监测主机存活的端口#!/usr/bin/env python# coding-utfimport argparseimport socket
- 本文实例讲述了Python常见MongoDB数据库操作。分享给大家供大家参考,具体如下:MongoDB 是一个基于分布式文件存储的数据库。由
- 最近项目中用到celery很多,Django快速接入celery,这里给份教程。准备pip安装celery、flower、eventlet快
- 判断类型在Python中我们可以使用type进行类型的判断#我们想看一个对象的的类型可以这样class A: passa = A
- 长期以来一直以为iframe跟div一样都是块级元素,直到今天在一个群中看到一位朋友问到iframe怎么居中的时候,测试了下发现原来我一直对
- 一、前言The DllPlugin and DllReferencePlugin provide means to split bundle