遇到这篇文章《Javascript异步调用时,回调函数内用到了函数外的变量》,是缘于我在《难道这就是JavaScript中的"闭包"》文章中遇到的问题时,Baidu搜到的,当时给我感觉,我要找的问题答案似乎和他很像,就花了点时间阅读了下,从中得到了启发,然后也好歹把问题解决掉了.但是篇帖子里面,提问者留下的代码,确实留下不少"问题"和"收获".

说实话,我当时没有真正理解他的意图,以及他在代码里注释留下的那个问题的含义, 但是这个问题下面的回帖的质量蛮高的,于是自己手工搭建了运行环境,想"跑"一下代码,决心把它弄明白.很快,很多问题和答案都出来了.

收获一:首先,这就就是个"伪"代码,根本不能"跑", 我想问那个提问者,这个代码你跑过吗,噢,看着代码就想当然的提了个想当然的问题.

收获二:我实际搭了一个模拟代码,然后调试, 发现在变量res中是可以保留内部回调函数每次访问的url的值,并不是由代码表象所表现的出来的,由forEach循环所触发的所谓的内部function访问外部变量res,后一次会覆盖掉前面一次的值,变量res中始终只能保存最新的一个.

var req_urls = ["WebForm1.aspx", "WebForm2.aspx", "WebForm3.aspx"],
res = {};
//forEach only use in Firefox or Chrome
req_urls.forEach(function(url) {
url += "?name=admin&psw=admin";
$.get(url, function(data) {
// 在这里,url只能保存最新的一个,怎么才能拿到调用$.get时的url呢。
res[url] = data;
//console.log(url);
});
});
//console.log(res);

收获三:为什么变量res中是可以保留内部回调函数每次访问的url的值, 在这个帖子的下面,一叫张杨的同学给了不错的解答,这里引用一下:

要理解其中的原因,首先就要理解JavaScript的作用域链和执行上下文,建议看看下面的链接:http://ryanmorr.com/understanding-scope-and-context-in-javascript/,也有中文的:图文并茂详解Javascript上下文与作用域。 简单解释一下就是函数内局部变量和参数的作用域其实在每次该函数执行的时候是不同的。在forEach的匿名回调函数里,每次执行的时候,url参数其实是在不同的作用域里的,每次函数调用都会重新构建参数变量和局部变量。所以setTimeout回调函数这个闭包里,访问的url变量其实是当前这次函数调用时url的引用。而这个引用不会被下次函数调用冲掉。

作者:张杨 链接:http://www.zhihu.com/question/23594158/answer/81362195 来源:知乎 著作权归作者所有。

但是, 我忽然发觉变量res是object类型,在回调函数内部是把res作为数组使用的,感觉同学张扬的解释并能很好的说明问题,似乎回调函数访问的是同一个res作变量,这个问题有待验证.

收获四:关于forEach,这个属性Firefox和Chrom支持的,IE下并不支持, 但可以通过coding的方式为IE增加forEach,就不深展开了,可以行Baidu

读一篇Javascript问题贴的收获的更多相关文章

  1. 透彻掌握Promise的使用,读这篇就够了

    透彻掌握Promise的使用,读这篇就够了 Promise的重要性我认为我没有必要多讲,概括起来说就是必须得掌握,而且还要掌握透彻.这篇文章的开头,主要跟大家分析一下,为什么会有Promise出现. ...

  2. 了解 HTTPS,读这篇文章就够了

    今天接到个活儿,让我科普 HTTPS .讲 HTTP 我都“方”,想要通俗易懂的说完 HTTPS, 我有点“圆”.在讲什么是 HTTPS 之前,我们先来看个漫画.   △ 图片来源于阮一峰的网络日志 ...

  3. 感觉自己应该重新读一次Javascript

    我自己也有一本Javascript书籍,是自己上大学的时候学校给提供的,现在,我依旧带着这本书.我决定要把这本书在重新温习一下.然后,开启下面的Javascript之旅.这是我看到博客园一位园友写的, ...

  4. [已读]ppk谈javascript

    读的第一本javascript方面的书籍,印象也比较深.ppk对浏览器兼容很有研究~~可以看看他的www.quirksmode.org

  5. 史上最强Java NIO入门:担心从入门到放弃的,请读这篇!

    本文原题“<NIO 入门>,作者为“Gregory M. Travis”,他是<JDK 1.4 Tutorial>等书籍的作者. 1.引言 Java NIO是Java 1.4版 ...

  6. spring-cloud-square源码速读(spring-cloud-square-okhttp篇)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. 读《你不知道的JavaScript(上卷)》后感-作用域闭包(二)

    github原文 一. 序言 最近我在读一本书:<你不知道的JavaScript>,这书分为上中卷,内容非常丰富,认真细读,能学到非常多JavaScript的知识点,希望广大的前端同胞们, ...

  8. 读《你不知道的JavaScript(上卷)》后感-浅谈JavaScript作用域(一)

    原文 一. 序言 最近我在读一本书:<你不知道的JavaScript>,这书分为上中卷,内容非常丰富,认真细读,能学到非常多JavaScript的知识点,希望广大的前端同胞们,也入手看看这 ...

  9. 第三篇 JavaScript基础

    知识预览 BOM对象 DOM对象(DHTML) 实例练习 转:https://www.cnblogs.com/yuanchenqi/articles/5980312.html#_label2 一.Ja ...

随机推荐

  1. 从2G到5G, 基站天线过去与未来

    在蜂窝移动通信系统中,天线是电路信号与空间辐射电磁波的转换器,是移动通信系统的末梢关键组成部分. 从2G到4G,移动基站天线经历了全向天线.定向单极化天线.定向双极化天线.电调单极化天线.电调双极化天 ...

  2. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

  3. C# readonly 与const

    引自:http://www.cnblogs.com/ryuasuka/p/3342282.html?utm_source=tuicool&utm_medium=referral 现在正在学&l ...

  4. xv6课本翻译之——附录A Pc的硬件

    Appendix A 附录A PC hardware Pc的硬件 This appendix describes personal computer (PC) hardware, the platfo ...

  5. ios小数向上、下取整,计算结果向上、下取整

    [摘要:小数背上与整,指小数局部间接进1 x=3.14, ceilf (x)=4 小数背下与整,指间接往失落小数局部 x=3.14,floor(x)=3 盘算效果背上与整 A被除数,B除数 ,(AB- ...

  6. Asp.net MVC的ViewData与ViewBag以及TemplateData的使用与区别

    ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从Asp.net MVC 1 就有了 ASP.NET MVC3 才有 基于Asp.net 3.5 fram ...

  7. CentOS7清理yum缓存和释放内存方法

    清理yum缓存 清理yum缓存使用yum clean 命令,yum clean 的参数有headers, packages, metadata, dbcache, plugins, expire-ca ...

  8. 定位框一闪而过 iOS Swift

    需求:获取经纬度. 方案:我自定义了一个类模块CLLocationModule.swift 备注以下代码里 let IS_IOS8 = (UIDevice.currentDevice().system ...

  9. iOS - drawRect致内存增加

    GPU VS CPU iOS - 软件绘图 自定义"斑马线背景"View,重写drawRect绘制斑马线: ⚠️ 仅仅添加这一个View,内存就比正常增加了3-5M之间. 测试源代 ...

  10. CocoaPods升级,升级以后出现bug的解决方法(升级必看!)

    命令行更新(安装)步骤[更新步骤] $ sudo gem update --system // 先更新gem,国内需要切换源 $ gem sources --remove https://rubyge ...