JavaScript闭包 取for循环i 【转】

射频测试基础知识总结 表示可以辐射到空间的电磁频率,频率范围从300KHz~110GHz之间,射频简称RF,是高频交流变化电磁波的简称,其每秒变化小于1000次被称为低频电流,超过10000次的称为高频电流,而射频就是这种高频电流。为了确保天线接收的信号能够在接收机的最后一级被正确的恢复,一个好的低噪音放大器需要在放大信号的同时产生尽可能低的噪音以及失真。两种,带内试验的范围也有一定的差别,比如,带内试验主要是检测信号的质量,如功率、频谱宽度、调制质量,而带外测试的是信号的杂散、谐波,主要是看对频带之外的干扰有多大。 阅读详情

解决办法一

/*
解决思路:
    增加若干个对应的闭包域空间(这里采用的是匿名函数),专门用来存储原先需要引用的内容(下标),不过只限于基本类型(基本类型值传递,对象类型引用传递)
 */
for(var i = 0;i<arr.length;i++){

    //声明一个匿名函数,若传进来的是基本类型则为值传递,故不会对实参产生影响,
    //该函数对象有一个本地私有变量arg(形参) ,该函数的 function scope 的 closure 对象属性有两个引用,一个是 arr,一个是 i
    //尽管引用 i 的值随外部改变 ,但本地私有变量(形参) arg 不会受影响,其值在一开始被调用的时候就决定了.
    (function (arg) {
        arr[i].onclick = function () {  //onclick函数实例的 function scope 的 closure 对象属性有一个引用 arg,
            alert(arg);                 //只要 外部空间的 arg 不变,这里的引用值当然不会改变
        }
    })(i);                              //立刻执行该匿名函数,传递下标 i(实参)
}

解决办法二

/*
解决思路:
    将下标作为对象属性(name:"i",value:i的值)添加到每个数组项(p对象)中
*/
for(var i = 0;i<arr.length;i++){
    //为当前数组项即当前 p 对象添加一个名为 i 的属性,值为循环体的 i 变量的值,
    //此时当前 p 对象的 i 属性并不是对循环体的 i 变量的引用,而是一个独立p 对象的属性,属性值在声明的时候就确定了
    //(基本类型的值都是存在栈中的,当有一个基本类型变量声明其等于另一个基本变量时,此时并不是两个基本类型变量都指向一个值,而是各自有各自的值,但值是相等的)
    arr[i].i = i;
    arr[i].onclick = function () {
        alert(this.i);
    }
}

解决办法三

/*
解决思路:
    与解决办法一有点相似但却有点不太相似.
    相似点:同样是增加若干个对应的闭包域空间用来存储下标
    不同点:解决办法一是在新增的匿名闭包空间内完成事件的绑定,而此例是将事件绑定在新增的匿名函数返回的函数上

    此时绑定的函数中的 function scope 中的 closure 对象的 引用 arg 是指向将其返回的匿名函数的私有变量 arg
 */
for(var i = 0; i<arr.length;i++){
    arr[i].onclick = (function(arg){
        return function () {
            alert(arg);
        }
    })(i);
}

解决办法四

/*
解决思路与解决办法一相同
 */
for(var i = 0; i<arr.length;i++){
    (function(){
       var temp = i;
        arr[i].onclick = function () {
            alert(temp);
        }
    })();
}

解决办法五

/*
解决思路与解决办法三及四相同
 */
for(var i = 0;i<arr.length;i++){
    arr[i].onclick = (function () {
        var temp = i;
        return function () {
            alert(temp);
        }
    })();
}

解决办法六

/*
解决思路:
    将下标添加为绑定函数的属性
 */
for(var i = 0;i<arr.length;i++){
    (arr[i].onclick = function () {
        alert(arguments.callee.i);      //arguments 参数对象  arguments.callee 参数对象所属函数
    }).i = i;
}

解决办法七

/*
解决思路:
    通过 new 使用 Function 的构造函数 创建 Function 实例实现,由于传入的函数体的内容是字符串,故 Function 得到的是一个字符串拷贝,而没有得到 i 的引用(这里是先获取 i.toString()然后与前后字符串拼接成一个新的字符串,Function 对其进行反向解析成 JS 代码)
 */
for(var i = 0;i<arr.length;i++){
    arr[i].onclick = new Function("alert("+i+");");//每 new 一个 Function 得到一个 Function 对象(一个函数),有自己的闭包域
}

解决办法八

/*
解决思路:
    直接通过 Function 返回一个函数
    与解决办法七的不同之处在于:
        解决办法七使用 new,使用了 new,此时 Function 函数就被当成构造器可以用来构造一个 Function 实例返回
        当前解决办法没有使用 new ,即将 Function 函数当成一个函数,传入参数返回一个新函数;
        其实此处 new 与不 new 只是的区别在于:
            使用了 new 即 Function 函数充当构造器,由 JS 解析器生产一个新的对象,构造器内的 this 指向该新对象;
            不实用 new 即 Function 函数依旧是函数,由函数内部自己生产一个实例返回.
 */
for(var i = 0;i<arr.length;i++){
    arr[i].onclick = Function("alert("+i+");");
}

解决办法九
使用ES6新语法 let 关键字 由于几新东西 各浏览器支持不同
chrome 及 opera支持以下语法

<script type="application/javascript">
    "use strict";//使用严格模式,否则报错 SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
    var arr = document.getElementsByTagName("p");
    for(var i = 0;i<arr.length;i++){
        let j = i;//创建一个块级变量
        arr[i].onclick = function () {
            alert(j);
        }
    }
</script>
信号完整性基础04:串扰(1) 我们理解了“单个”传输线(传输线是信号路径+回流路径,切记~),但大多数情况下单独“传输线”的情况并不多见(理想情况下的同轴线缆可以算一个),大多数我们PCB板上有成百上千条走线,它们组成了一个“大社会”,就如当年的TVB神剧《创世纪》一样,到处充满着恩怨情仇;稍处理不慎,单板这个“社会”就会崩溃。那么我们要从哪里入手去理解它呢?最基本的就是从两条PCB走线(传输线)之间的串扰开始。好,年前倒数第二章:《为什么会有串扰》。 ps:我们了解了x射线是啥,那么今天开始讲“放射线”,这两种东西是否就是同一种呢~ 阅读详情

相关推荐

ADS 使用教程(十八)Encrypting Designs using RFIP Encoder in ADS

在这一节,我们使用RFIP Encoder进行设计加密,这是一种保护知识产权和敏感设计数据的重要方法。RFIP Encoder提供了一种安全的方式来加密设计文件,确保只有授权人员能够访问和使用这些文件。

Dirge19的博客 1172

js经典闭包问题

像这样一个代码片段,初学者会理所当然地认为依次点击Li会弹出相应的0、1、2、3、4、5,但实际结果却是这样的 闭包简单理解就是:一个函数中嵌套了另一个函数,里面的一个函数要访问外层函数的变量,所以就形成了一个闭包,闭包即是为了保留某些局部变量的值而存在的。 解决办法一 /* 解决思路: 增加若干个对应的闭包域空间(这里采用的是匿名函数),专门用来存储原先需要

finalfantasy 573

大整数因数分解工具——yafu

可以将大整数放在一个新建文件中——data.txt,最后面一定要换行,不然会出现eof;done processing batchfile,运行命令。2.点击设置——系统——系统信息——高级系统设置——环境变量——点击PATH(上下都可以)——新建 添加yafu-x64.exe 所在路径——点击确定。,如果整数数过长,会出现错误mismatched parens;1.找到yafu-x64.exe 所在的文件路径。如果出现以下图像,说明配置成功。3.打开cmd,输入。

l2ohvef的博客 6156

for循环中的闭包问题

先看一段代码 <ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> </ul> var li=document.getElementsByTagName('li'); var len=li.length; for(v...

长歌的博客 4215

在pycharm2021.2中学习opencv图像处理,基于python3.9.7、pycharm完成配置

在pycharm中学习opencv图像处理安装python下载python安装包开始安装安装pycharm社区版下载pycharm开始安装如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 安装python 使用pycharm学习opencv应该是最简单的了,对新手比较友好,

steveqobs 7710

Microduck机器鸭开源AI项目:本地部署与模型微调实战指南

开源AI模型的本地化部署与定制化训练正成为开发者关注的技术趋势。与依赖云端API的在线服务不同,本地部署允许用户将模型权重下载至自有GPU环境,通过命令行或WebUI完成推理、批量任务处理及API集成,在数据隐私、离线使用和接口稳定性方面具备天然优势。模型微调则基于预训练权重,利用领域数据训练特定任务,从而提升生成质量与业务适配度。这一技术路径广泛应用于内容生成、智能对话、自动标注等场景,尤其适合消费级显卡开发者、数据敏感型团队及二次开发研究者。Microduck(机器鸭)作为近期预售火爆的开源项目,围绕“

weixin_29082143的博客 415

js重点之——闭包

闭包 理解: 1)闭包是嵌套的内部函数 2)闭包是被引用变量(函数)的对象 闭包是存在于嵌套的内部函数中 产生:当一个嵌套的内部(子函数)引用了嵌套的外部(父函数)时,会产生闭包。 产生闭包条件: 1)函数嵌套 2)内部函数引用了外部函数的数据(变量、函数) 3)执行外部函数 (必须调用外部函数,但是可以不调用内部函数) 闭包在外部函数定义时候就产生了,而不是在调用时才产生 【这里就要注意函数执行上下文--函数提升的情况——>函数声明和函数表达式】 ...

weixin_45944877的博客 791

Python 爬虫实战:龙虎榜机构买卖数据爬取与代码详解(附数据分析)

龙虎榜是证券市场中重要的市场信息之一,记录了当日大宗交易及机构买卖情况,包括机构名称、买卖方向、成交金额、成交股数、买入卖出价格等信息。通过分析龙虎榜数据,投资者可以更好地了解市场动向和机构投资者的行为,从而做出更准确的决策。本文将详细介绍如何使用 Python 编写爬虫程序,高效地抓取龙虎榜机构买卖数据,并进行数据分析。我们将从环境搭建、数据抓取、数据存储到数据分析等关键步骤逐一展开,帮助读者掌握完整的爬虫实战流程。

u014481728的博客 702

JS中的闭包问题

JS中闭包,垃圾收获机制,作用域继承等相关知识

qq_51130780的博客 502

杰理AC695N/AC696N/AC701N系列芯片在线调音教程

本教程详细介绍AC695N/AC696N/AC701N芯片在线音效调试方法,包括工具准备(需安装杰理包管理器)、程序修改(需关闭USB功能并启用在线调试宏)、连接方式(USB或串口)、音效调节步骤(EQ和混响参数调整)以及配置保存。注意事项包括版本匹配、连接检查和供电稳定等,并提供常见问题解决方案。适用于快速配置实时音效调试环境并保存最终配置。

qq_42014563的博客 1409

YOLOv8改进 | 主干篇 | 利用MobileNetV1替换Backbone(轻量化网络结构)

本文给大家带来的改进机制是MobileNetV1,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者。

Snu77的博客 3966

10 个用图表解释JavaScript 闭包的面试题

英文 | https://betterprogramming.pub/10-javascript-closure-challenges-explained-with-diagrams-c964110805e7翻译 | 杨小爱闭包是函数式编程中的核心概念之一,是每个 JavaScript 开发人员必备的知识。在这里,我准备了 10 个关于闭包的面试挑战题,这些基本都是面试中...

web前端开发 838

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JavaScript--------闭包 取for循环i 【转】

JavaScript闭包 取for循环i 【转】 2011-10-10 10:20 415人阅读 评论(1) 收藏 举报 有个网友问了个问题,如下的html,为什

w36680130的博客 242

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

js闭包--关于在for循环中每隔一秒打印一次

上篇我们介绍了js闭包-关于在for循环中绑定事件打印变量i 我们可以将结果一次性打印出0 1 2 3 4,那么下面我介绍一下每隔一秒钟一次打印出 0 1 2 3 4 1000*i是重点 es5方法: for (var i = 0; i < 5; i++) { (function (j) { setTimeout(function() { console.log(new...

qq_36711388的博客 6715

JS之经典for循环闭包问题解决方法

JS之经典for循环闭包问题解决方法 像这样一个代码片段,初学者会理所当然地认为依次点击Li会弹出相应的0、1、2、3、4、5,但实际结果却是这样的 我们无论点哪个按钮,最后弹出来的都是6。经典的for循环闭包问题。 那么,首先让我们来了解一下什么是闭包,百度百科是这样解释的:闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文

YuLi_Zoe的专栏 1万+

在for循环内部的函数中获取for循环中的循环变量i

先来看一组简单代码,引出这篇博客的核心 for(var i=0;i<9;i++){ console.log(i); //依次输出0.1.2.3.4.5.6.7.8 function f() { console.log(i);; } } f();//输出单个9 在这段代码中,在函数内部,i的值为确定的9,这是因为for循环{}没有块...

weixin_44821905的博客 6479

JS中for循环里面的闭包问题的原因及解决办法

我们先看一个正常的for循环,普通函数里面有一个for循环,for循环结束后最终返回结果数组 function box(){ var arr = []; for(var i=0;i<5;i++){ arr[i] = i; } return arr; } //alert 输出一个弹出框 alert(box()) ...

weixin_40333655的博客 4059

JS中如何理解经典案例 for 循环中的闭包

js关于for循环中的闭包问题? for(var i=0,arr=[];i&lt;=3;i++) { arr.push(function(){alert(i)}); } arr0; // ?? 结果不是0 arr1; // ?? 全是4 改装后 for(var i=0,arr=[];i&lt;=3;i++) { arr.push( ...

Leo____Wang的博客 3132

JS闭包解决js for循环输出i为同一值的方案

最近在做一个项目,发现js for循环变量输出的i老是同一个值,想到了以前做的项目也涉及到js闭包,重新整理代码发出来做一个笔记,初学者一看即懂,大神可以略过了。 JS闭包特性: ①函数嵌套函数 ②函数内部可以引用函数外部的参数和变量 ③参数和变量不会被垃圾回收机制回收 直接上代码: <div id="demo"></div> <br /> <div id="demo2"></div> <scri

mechrevo的博客 875

js for循环闭包

js使用过程中,当使用for循环时 for(var i=0; i<10; i++) { console.log(i) } 得到结果 当在for里面执行异步操作时,如setTimeout函数 for(var i=0; i<10; i++) { setTimeout(() => { console.log(i) }, 300) } 得到结果是输出10个10 ...

Tiny2017的博客 1343

for循环闭包问题

记录我学JavaScript踩的第一个坑 在实现一个输入数量算商品总价的表格,可事件函数内部的i值总获取不对,还好问了群里的大神,太感谢了。 说是一个for循环内部嵌套事件函数引起的闭包问题i获取不到的原因是因为,事件函数内部没有i这个值,就会到外部函数查找,而外部函数的值是每次循环后的结果,所以一直都是获取到7,下面的赋值自然就会报错。 解决方案: 解决方法一: 将for循环的var改成let,...

weixin_43540912的博客 1121

javascript解决for循环中i取值的问题

最近在做项目时遇到调用for循环中i取值问题,主要代码如下:function delete__listen() { var detNum=document.getElementsByTagName('li'); for(var i = 0; i < detNum.length; i++){ detNum[i].onclick = function(){

xumeishan的博客 3147

js闭包--关于在for循环中绑定事件打印变量i是最后一次。

闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。 在for循环里面的匿名函数执行 return i 语句的时候,由于匿名函数里面没有i这个变量,所以这个i他要从父级函数中寻找i,而父级函数中的i在for循环中,当找到这个i的时候,是for循环完毕的i,也就是5,所以得到五个5。 先看题目: for (v...

qq_36711388的博客 1315

JavaScript闭包之for循环

之前讲了最简单的闭包,然而闭包最经典的是那个for循环,几乎每一个想要理解闭包的都会遇到这个例子,每一个讲解闭包的也会举这个例子。我这次不是要讲这么解决这个for循环闭包问题,而是解释这个闭包。 &amp;lt;ul&amp;gt; &amp;lt;li&amp;gt;0&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;1&amp;lt;/li&amp;gt; &amp;

wade3po的博客 495
上一篇: echarts 常用方法 初始化和销毁
下一篇: JS 点击复制Copy
Uncle_long
博客等级 码龄10年 17粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值