最近用vue.js用的很爽,在全栈开发的路上一路狂奔,发现后台跟前台一起确实更有意义。

记录一个比较有意思的bug:

目标是对一个全局的paramList进行json格式化显示。代码借鉴了 http://tool.oschina.net/codeformat/json

for(var i = 0; i<_self.paramList.length; i++) {
  id = "#" + _self.paramList[i];
  console.log("___" + id)
$(id).on("click", function () {
console.log("**** id : " + id);
_self.index = id.substring(1,
id.length)
console.log("new id :" + _self.index)
var opt = {
dom: "#preForParams"
};
var jsonFormatter = new JsonFormater(opt);
jsonFormatter.doFormat(js_source);
$("#formParams").modal({
keyboard: true
});
});
}

  

这段代码在Vue.ready方法里调用,发现最后永远显示的paramList的最后一个元素的json格式化<pre>。

在IDEA中有提示: mutable variable is accessible from closure.

1. 尝试初始化一个全局变量temp,在onclick方法里面使用_self.temp,发现_self.temp还是固定的值。

原因分析:在ready中代码已经执行完成,对那一时刻的状态而言,var i就是_self.paramList.length-1,所以每一个click时间注册都一list的最后一个数据为准,导致了bug产生 :(

2. 在stackoverflow发现解释:

The wrong way of using a closure inside a loop

for(var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}

具体参考 http://bonsaiden.github.io/JavaScript-Garden/#function.closures

这是javascript最重要的特性之一:闭包。

One of JavaScript's most powerful features is the availability of closures. With closures, scopes always keep access to the outer scope, in which they were defined. Since the only scoping that JavaScript has is function scope, all functions, by default, act as closures.

解决方案:

solution 1: with anonymous wrapper

for(var i = 0; i < 10; i++) {
(function(e) {
setTimeout(function() {
console.log(e);
}, 1000);
})(i);
}

solution 2: returning a function from a closure

for(var i = 0; i < 10; i++) {
setTimeout((function(e) {
return function() {
console.log(e);
}
})(i), 1000)
}

此方法体现了函数式编程的关键: 函数是一等公民。(意思是函数跟基本数据类型地位等同,computing 传入参数,得出结论。即只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。)

最终,采取了第一种solution,代码如下:

(function(e,v) {
$(e).on("click", function () {
console.log("**** id : " + e);
_self.index = e.substring(1, e.length)
console.log("new id :" + e)
var opt = {
dom: "#preForParams"
};
var jsonFormatter = new JsonFormater(opt);
jsonFormatter.doFormat(v);
$("#formParams").modal({
keyboard: true
});
});
})(id, js_source);

 完美解决。

javascript的一点学习的更多相关文章

  1. 学习javascript 的一点感想

    原文:学习javascript 的一点感想 //动态性是指,在一个Javascript对象中,要为一个属性赋值,我们不必事先创建一个字段,只需要在使用的时候做赋值操作即可,如下例:var obj=ne ...

  2. 治愈 JavaScript 疲态的学习计划【转载】

    来源:伯乐在线 - Rose Wang 像其他人一样,最近我读了 Jose Aguinaga 的文章 <How it feels to learn JavaScript in 2016>. ...

  3. 深入浅出的javascript的正则表达式学习教程

    深入浅出的javascript的正则表达式学习教程 阅读目录 了解正则表达式的方法 了解正则中的普通字符 了解正则中的方括号[]的含义 理解javascript中的元字符 RegExp特殊字符中的需要 ...

  4. Javascript创建对象的学习和使用

    <html> <head> <meta charset="utf-8"> <title>javascript对象的学习</ti ...

  5. Javascript提升阶段学习

    JavaScript1:javascript简介 JavaScript是一种脚本语言,能实现网页内容的交互显示,当用户在客户端显示该网页时,浏览器就会执行JavaScript程序,用户通过交互的操作来 ...

  6. 前端之JavaScript第一天学习(1)-JavaScript 简介

    javaScript 是世界上最流行的编程语言. 这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备. JavaScript 是脚本语言 JavaSc ...

  7. ArcGIS API for JavaScript 4.2学习笔记[0] AJS4.2概述、新特性、未来产品线计划与AJS笔记目录

    放着好好的成熟的AJS 3.19不学,为什么要去碰乳臭未干的AJS 4.2? 4.2全线基础学习请点击[直达] 4.3及更高版本的补充学习请关注我的博客. ArcGIS API for JavaScr ...

  8. javascript的ES6学习总结(第二部分)

    1.数组循环 介绍数组循环之前,先回顾一下ES5数组的循环 (1)数组遍历(代替普通的for):arr.forEach(callback(val,index,arr){todo}) //val是数组的 ...

  9. javascript的ES6学习总结(第一部分)

    ES6(ESNext学习总结——第一部分) ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版. ECMA每年6月份,发布一个版本 201 ...

随机推荐

  1. 缓存和sd卡的路径(原)

    在需要存储的时候,路径的问题是初学者比较迷惑的,下面是对于getCacheDir().getFilesDir().getExternalFilesDir().getExternalCacheDir() ...

  2. CentOS7下安装MySQL5.7安装与配置(转)

    原文地址:http://www.centoscn.com/mysql/2016/0626/7537.html 安装环境:CentOS7 64位 MINI版,安装MySQL5.7 1.配置YUM源 在M ...

  3. Iso-Seq学习

    SMRT portal安装教程: http://www.pacb.com/wp-content/uploads/2015/09/SMRT-Analysis-Software-Installation- ...

  4. 【转】Web Service单元测试工具实例介绍之SoapUI

    转自:http://blog.csdn.net/oracle_microsoft/article/details/5689585 SoapUI 是当前比较简单实用的开源Web Service 测试工具 ...

  5. akka优势

    1.提供可扩展的实时事务处理. 2.为以下目标设计: 垂直扩展(并发) 水平扩展(远程调用) 高容错 3.Akka的核心,Akka-actor非常小的,可以非常方便地放进你的应用中,提供你需要的异步无 ...

  6. Axis2使war包发布为WebService

    首先 吐槽下 Axis2的Eclipse插件.不好用,而且局限性大.并且添加包的过程...会及其痛苦.(懂的自然懂) 而且 发布的aar文件,不能解压缩重新打包再压缩...尝试过添加 jar包,但报错 ...

  7. 《JavaScript DOM编程艺术》读后总结

    这是我读的第一本关于JS的书,刚开始我为了选择合适的学习JS的书,看了网上许多人的意见,基本上都是推荐先读这本书.书的内容挺简单的,确实很适合初学者看,阅读的过程中不会产生什么障碍.内容虽然简单,但我 ...

  8. python之读取cdv

    csv是Comma-Separated Values的缩写,是用文本文件形式储存的表格数据,比如如下的表格: 就可以存储为csv文件,文件内容是:No.,Name,Age,Score1,Apple,1 ...

  9. 王爽<<汇编语言>> 实验十四

    ;以"年/月/日 时:分:秒"的格式, 显示当前的日期, 时间 assume cs:code code segment main: out 70h,al ;告诉CMOS RAM将要 ...

  10. 当窗体获得焦点时禁用max快捷键

    最近一段时间一直在MXS里用dotnet写界面...写的各种头晕眼花... 过程中遇到了 TextBox 控件输入时 与max快捷键冲突的问题. 解决办法是 用 MaxTextBox 控件替换,今天请 ...