一个小函数引起的思考
2017-07-18 22:24
218 查看
var a = []; for(var i = 0;i<10;i++){ a[i] = function(){ console.log(i) } a[0]()//0,1,2,3,4,5,6,7,8,9;console.log(a[i]) } a[0]()//10
console.log(a[i])你会发现,打印出来的全部是function(){console.log(i)},也就是说在函数执行前,每个函数的i并没有解析
但是当在外面执行的时候,其实函数执行的时候i已经变成了10,当函数console.log(i)的时候i是10;那么你也许会问明明循环中已经定义好了a[6]= function(){console.log(6)}嘛,其实不是这样的,当在函数执行之前是不会读取函数体中的变量的,也就是说,循环了那么多次,定义了那么多的函数,函数体中的变量一直是i,只有在调用的时候才会寻找i的值
当在里面执行的时候,i是随着循环走的,每循环一次i就变化一次,所以在里面执行的时候函数中的i就是当前循环的i的值,这也就可以解释为什么在函数体内,a[0]()可以有那么多的值,因为还是上面的道理,当一次循环执行到a[0]()的时候,这个时候就开始为函数寻找函数里面的值到底是谁,结果自然而然就是当前循环的i的值嘛,当再一次接着循环的时候还是一样的道理.....
相关文章推荐
- VC++一个函数引起的思考
- 一个BUG引起的思考
- strncpy 引起的思考,重新认识了strncpy这个函数
- 一个函数返回临时对象引起的编译器优化问题
- 一个容器Crash引起的思考
- 一个程序引起的思考
- 一个串口程序引起的思考
- 关于一个项目的函数的思考,及项目的规划
- 一个肉夹馍引起的思考
- 对一个程序的思考5(C++各种函数调用)
- 一段旧代码,引起的关于OO中一个问题的思考
- 一个类型转换而引起的三级事件的一些思考 数据检查
- 一个基本类型在方法中修改引起的思考
- 一个困惑引起的思考
- IT系统故障引起的一个事故的思考
- 无法捕获异常:Java关于在catch中抛出一个异常给外围函数却捕获不到该异常的思考
- js中必须用分号的地方——由一个题目引起的思考
- 一个BUG引起的思考
- IT系统故障引起的一个事故的思考
- 一个lua代码中的bug引起的思考:不要被c++ crash堆栈误导