遇到这篇文章《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. Hibernate 查询方式(HQL/QBC/QBE)汇总

    作为老牌的 ORM 框架,Hibernate 在推动数据库持久化层所做出的贡献有目共睹. 它所提供的数据查询方式也越来越丰富,从 SQL 到自创的 HQL,再到面向对象的标准化查询. 虽然查询方式有点 ...

  2. hql中in关键字的用法

    hql: from " + FoodComment.class.getName() + " f where f.id in :groupIds" 封装的方法: publi ...

  3. .NET、C#和ASP.NET,ASP.NET MVC 四者之间的区别

    经常,会有一些人搞不清楚.NET和c#和ASP.NET这三者之间的关系,她们都是什么呢?他们之间有什么关系呢?总结一下 首先:什么是.NET? .NET是微软公司下的一个开发平台,.NET核心就是.N ...

  4. [转]HQL中的子查询

    原文地址:http://blog.csdn.net/xb12369/article/details/8638683 子查询:   子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一 ...

  5. 奇异值分解 SVD

    一基本知识 A是一个m*n的矩阵,那么A的SVD分解为\(A_{mn} = U_{mm}\Sigma _{mn}V^T_{nn}\),其中\(U^TU = I\),\(V^TV = I\),UV的列向 ...

  6. 如何给frame标签的src属性以及a标签的href属性自动设值

    <frame src="" id="main" name="main" marginwidth="0" margi ...

  7. FilenameFilter过滤文件名

    前言: 文件IO是程序设计语言的一个特点,本文将针对Java的File文件名过滤进行测试. 测试目录截图: 测试结果: data.txt output-.txt output-.txt output- ...

  8. 教你开发jQuery插件(转)

    教你开发jQuery插件(转) 阅读目录 基本方法 支持链式调用 让插件接收参数 面向对象的插件开发 关于命名空间 关于变量定义及命名 压缩的好处 工具 GitHub Service Hook 原文: ...

  9. POJ 2253 Frogger(Dijkstra)

    传送门 Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 39453   Accepted: 12691 Des ...

  10. 了不起的全能MAC系统监测工具iStat Menus 5下载

    iStat Menus 5 是一款由软件开发商 Bjango 制作的 System Monitor (工具,也是笔者电脑里的必装应用之一,它能让用户最快速.最直观地了解到几乎各硬件所有的运行状态,其中 ...