百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

JavaScript 闭包 javascript中的闭包

suiw9 2024-11-09 14:50 16 浏览 0 评论

1. 什么是闭包

闭包就是一个函数, 两个函数彼此嵌套, 内部函数就是闭包。

形成闭包条件是内部函数需要通过return给返回出来.

① 闭包允许我们在全局作用域中访问局部变量

② 闭包可以让局部变量一直驻留在计算机的内存中

<script type="text/javascript">
//简单闭包机制声明
function f1(){
function f2(){
document.write('I am f2');
}
return f2;
}
//如下代码的本质:f2函数对象 对 ff变量进行赋值
//其实引用传递
//执行的结果就是同一个function先后有两个名字进行指引
var ff = f1(); //闭包使用
ff(); //I am f2
</script>

2. 闭包特点

闭包有权利调用其父级环境的变量信息。

<script type = "text/javascript" >
//闭包特点:可以调用父级环境的变量信息
function f1() {
var addr = "中关村";
function f2() {
return '地址:' + addr;
}
f2(); //可以视为多余语句
return f2;
}
var ff = f1();
document.write(ff());
</script>

地址:中关村(addr的信息在外部环境被访问出来了)

为什么闭包可以在外部环境调用内部环境的变量

以上代码f2是局部的, ff是全局的

因此可以使得"ff"在外部环境访问function函数


我们在外部环境并没有直接访问addr变量

而是通过ff调用function访问到的

此时addr早早地已经"固化"为function内部"AO的成员"了

因此闭包允许在外部访问内部环境的变量信息

3. 闭包使用规则

同一个闭包机制可以创建多个闭包函数出来, 它们彼此没有联系, 都是独立的。

并且每个闭包可以保存自己个性化的信息。

<script type="text/javascript">
//闭包规则:同一个闭包机制可以生成许多闭包函数
// 并且这些函数彼此独立、没有联系
// 每个函数内部也有保留自己“个性化”的信息
function f1(num){
function f2(){
document.write('数字:'+num);
}
return f2;
}
var fa = f1(100); // 生成一个闭包函数
var fb = f1(120); // 生成一个闭包函数
var fc = f1(140); // 生成一个闭包函数
fa(); //数字:100
fc(); //数字:140
fb(); //数字:120
</script>

4. 闭包案例: 闭包生成数组元素

(1) 失败案例:

<script type = "text/javascript">
//闭包 创建数组元素
/*
arr[0]= function(){document.write(0)}
arr[1]= function(){document.write(1)}
arr[2]= function(){document.write(2)}
arr[3]= function(){document.write(3)}
*/
var arr = new Array();
for(var i = 0; i < 4; i++) {
arr[i] = function() {
document.write(i);
}
}
//真实结果 与 期望结果 不一致
//以上for循环执行完毕后会给arr数组赋值4个元素,下标分别为0 1 2 3
//4个元素的值都是function,它们内部访问了同一个i变量,值为4
arr[2](); //4
arr[3](); //4
</script>

(2)成功案例

<script type = "text/javascript" >
//闭包 创建数组元素
/*
arr[0]= function(){document.write(0)}
arr[1]= function(){document.write(1)}
arr[2]= function(){document.write(2)}
arr[3]= function(){document.write(3)}
*/
var arr = new Array();
for(var i = 0; i < 4; i++) {
//arr[i] = 闭包机制;
//在此处通过for循环会依次调用f1()闭包机制, 共调用4次
//也就会创建4个彼此"独立的函数"分别赋予给每个元素, 并且每个函数内部有"个性化"信息供访问
arr[i] = f1(i);
}
function f1(n) {
function f2() {
document.write(n);
}
return f2;
}
arr[2](); //2
arr[3](); //3
arr[0](); //0
arr[1](); //1
</script>

闭包优化:

<script type="text/javascript">
var arr = new Array();
for(var i=0;i<4;i++){
arr[i] = (function(n){
function f2(){
document.write(n);
}
return f2;
})(i);
}
arr[2]();
arr[3]();
</script>

5 闭包事件操作

(1) 失败案例

<ul>
<li>标题一</li>
<li>标题二</li>
<li>标题三</li>
</ul>
<script type="text/javascript">
window.onload = function(){
var lis = document.getElementsByTagName('li');
for(var k=0; k<lis.length; k++){
//给每个li设置mouseover和mouseout事件
//在javascript或jquery里边,在事件处理函数内部的this关键字,
//大部分情况下都代表“元素节点对象”
lis[k].onmouseover = function(){
//this.style.backgroundColor = "lightgray";
lis[k].style.backgroundColor = "lightgreen";
}
lis[k].onmouseout = function(){
//this.style.backgroundColor = "";
lis[k].style.backgroundColor = "";
}
/*
上述事件设置执行失败
每个function内部访问的k不是本身"个性化"信息,而是一个外部变量
该外部变量在for循环执行完毕后永远定格为“3”的信息
因此每个事件触发都是在调用lis[3],因此系统提示没有定义
*/
}
}
</script>

(2) 成功案例

<ul>
<li>标题一</li>
<li>标题二</li>
<li>标题三</li>
<li>标题四</li>
</ul>
<script type="text/javascript">
window.onload = function(){
var lis = document.getElementsByTagName('li');
for(var k=0; k<lis.length; k++){
//给每个li设置mouseover和mouseout事件
//通过over()和out()闭包机制给每个li都设置一个独立的、有个性化信息访问的时间处理函数
lis[k].onmouseover = over(k);
lis[k].onmouseout = out(k);
}
function over(n){
function f2(){
lis[n].style.backgroundColor = "lightblue";
}
return f2;
}
function out(n){
function f2(){
lis[n].style.backgroundColor = "";
}
return f2;
}
}
</script>

进一步优化

<script type="text/javascript">
window.onload = function(){
var lis = document.getElementsByTagName('li');
for(var i=0;i<lis.length;i++){
(function(j){//形参
lis[j].onmouseover = function(){
lis[j].style.backgroundColor = "lightgreen";
}
lis[j].onmouseout = function(){
//this.style.backgroundColor = "";
lis[j].style.backgroundColor = "";
}
})(i);//实参
}
}
</script>

6 闭包优化

window.onload = function(){
var lis = document.getElementsByTagName('li');
for(var i=0; i<lis.length; i++){
lis[i].onclick = clk(i);
function clk(n){
return function (){
alert(lis[n].firstChild.nodeValue);
}
}
}
</script>

以上代码优化为:

<script type = "text/javascript">
window.onload = function() {
var lis = document.getElementsByTagName("li");
for (var i = 0; i < lis.length; i++) {
lis[i].onclick = (function(n) {
return function() {
alert(lis[n].firstChild.nodeValue);
}
})(i);
}
}
</script>

相关推荐

5款Syslog集中系统日志常用工具对比推荐

一、为何要集中管理Syslog?Syslog由Linux/Unix系统及其他网络设备生成,广泛分布于整个网络。因其包含关键信息,可用于识别网络中的恶意活动,所以必须对其进行持续监控。将Sys...

跨平台、多数据库支持的开源数据库管理工具——DBeaver

简介今天给大家推荐一个开源的数据库管理工具——DBeaver。它支持多种数据库系统,包括Mysql、Oracle、PostgreSQL、SLQLite、SQLServer等。DBeaver的界面友好...

强烈推荐!数据库管理工具:Navicat Premium 16.3.2 (64位)

NavicatPremium,一款集数据迁移、数据库管理、SQL/查询编辑、智能设计、高效协作于一体的全能数据库开发工具。无论你是MySQL、MariaDB、MongoDB、SQLServer、O...

3 年 Java 程序员还玩不转 MongoDB,网友:失望

一、什么场景使用MongoDB?...

拯救MongoDB管理员的GUI工具大赏:从菜鸟到极客的生存指南

作为一名在NoSQL丛林中披荆斩棘的数据猎人,没有比GUI工具更称手的瑞士军刀了。本文将带你围观五款主流MongoDB管理神器的特性与暗坑,附赠精准到扎心的吐槽指南一、MongoDBCompass:...

mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?

前言最近在做neo4j相关的同步处理,因为产线的可视化工具短暂不可用,发现写起来各种脚本非常麻烦。...

solidworks使用心得,纯干货!建议大家收藏

SolidWorks常见问题...

统一规约-关乎数字化的真正实现(规范统一性)

尽管数字化转型的浪潮如此深入人心,但是,对于OPCUA和TSN的了解却又甚少,这难免让人质疑其可实现性,因为,如果缺乏统一的语义互操作规范,以及更为具有广泛适用的网络与通信,则数字化实际上几乎难以具...

Elasticsearch节点角色配置详解(Node)

本篇文章将介绍如下内容:节点角色简介...

产前母婴用品分享 篇一:我的母婴购物清单及单品推荐

作者:DaisyH8746在张大妈上已经混迹很久了,有事没事看看“什么值得买”已渐渐成了一种生活习惯,然而却从来没有想过自己要写篇文章发布上来,直到由于我产前功课做得“太过认真”(认真到都有点过了,...

比任何人都光彩照人的假期!水润、紧致的肌肤护理程序

图片来源:谜尚愉快的假期临近了。身心振奋的休假季节。但是不能因为这种心情而失去珍贵的东西,那就是皮肤健康。炙热的阳光和强烈的紫外线是使我们皮肤老化的主犯。因此,如果怀着快乐的心情对皮肤置之不理,就会使...

Arm发布Armv9边缘AI计算平台,支持运行超10亿参数端侧AI模型

中关村在线2月27日消息,Arm正式发布Armv9边缘人工智能(AI)计算平台。据悉,该平台以全新的ArmCortex-A320CPU和领先的边缘AI加速器ArmEthos-U85NPU为核心...

柔性——面向大规模定制生产的数字化实现的基本特征

大规模定制生产模式的核心是柔性,尤其是体现在其对定制的要求方面。既然是定制,并且是大规模的定制,对于制造系统的柔性以及借助于数字化手段实现的柔性,就提出了更高的要求。面向大规模定制生产的数字化业务管控...

创建PLC内部标准——企业前进的道路

作者:FrankBurger...

标准化编程之 ----------- 西门子LPMLV30测试总结

PackML乃是由OMAC开发且被ISA所采用的自动化标准TR88.00.02,能够更为便捷地传输与检索一致的机器数据。PackML的主要宗旨在于于整个工厂车间倡导通用的“外观和感觉”,...

取消回复欢迎 发表评论: