遇到这篇文章《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. .NET MVC实现多图片上传并附带参数(ajaxfileupload)

    做网站呢,都免不了要做图片上传. 还记得去年做微信的时候用WebAPI+ajaxfileupload.js做了一个能够附带参数上传的功能,博文地址:.NET WebAPI 实现图片上传(包括附带参数上 ...

  2. C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper

    前言:之前学习过很多的Bootstrap组件,博主就在脑海里构思:是否可以封装一套自己Bootstrap组件库呢.再加上看到MVC的Razor语法里面直接通过后台方法输出前端控件的方式,于是打算仿照H ...

  3. "Installation failed !" in GUI but not in CLI (/usr/bin/winusb: line 78: 18265 Terminated )

    "Installation failed !" in GUI but not in CLI (/usr/bin/winusb: line 78: 18265 Terminated ...

  4. adb devices 偵測不到 手機

    現象: system 有偵測到 mobile phone, xxx@xxx-ThinkPad-T460p:~/.android$ lsusb Bus Device : ID 1d6b: Linux F ...

  5. C++ namespace

    namespace, 命名空间, 用于解决命名冲突的问题. Python中的package/module, Javascript中的object, Java中的package都具有这样的功能. 如何使 ...

  6. Java学习笔记(一)

    纯属个人学习笔记,有什么不足之处大家留言,谢谢 Java程序打包与JAR运行方法 在Eclipse的"包资源管理器"视图中找到要打包成JAR文件的项目.在项目名称上单击鼠标右键,在 ...

  7. 图文混排--CoreText的简单运用

    常见的在一些微博微信中可以看见一段文字中有不同的字体,字体有不同的颜色,并且可能会有一些笑脸之类的表情,这些可以通过图文混排做到. 图文混排可以通过WebView和CoreText做到,其他还有别的方 ...

  8. Ubuntu安装RobotFramework

    安装Python Ubuntu默认已安装 安装pip wget https://bootstrap.pypa.io/get-pip.py python get-pip.py 安装RobotFramew ...

  9. ReactNative 分享解决listView的一个郁闷BUG

    用ListView的时候,会出现一个非常傻bi的情况,就是render的时候,listView不显示,需要碰/滑一下才会显示. 一开始我在怀疑自己是不是布局哪里有冲突,改到哭都没发现布局有什么问题,直 ...

  10. DOM解析XML报错:Content is not allowed in prolog

    报错内容为: Content is not allowed in prolog. Nested exception: Content is not allowed in prolog. 网上所述总结来 ...