javascript高级程序教程中关于闭包与变量的问题
2017-06-12 22:13
513 查看
引入一个经典的闭包与变量的问题
闭包只能取得包含函数中任何变量的最后一个值,闭包保存的是整个变量对象,而不是变量的值
这个函数会返回一个数组,表面上看,似乎每个函数都会返回自己的索引值。但实际上,每个函数都会返回10.因为每个createFunction(0函数活动对象引用的都是同一个变量i。此处的i是闭包的包含函数craeteFunction的局部变量,因为在函数内用var定义的变量是局部变量(注意不用var定义则是全局变量);
那么可以这样使闭包符合预期
这里没有把闭包直接赋值给数组,而是定义了一个立即执行函数,将其赋值给了数组,给立即执行函数传入实参i,由于函数参数按值传递,在立即执行函数内部以形参num来保存变量i的当前值。在匿名执行函数内部又有一个闭包来返回num的值。这样result数组中的每个函数都有一个num变量的副本来保存着i的值,这样就可以正确返回了
对上面的代码进行如下调用
将createFunction函数的返回值即result数组赋值给a,然后利用a对立即执行函数result[i]=function(num){… }(i)进行调用,注意要写成a8这个函数才能被调用,[]中的值作为i值传入立即执行函数,然后num把当前i的值保存,最后return出来,结果如下
function createFunction(){ var result=new Array(); for(var i=0;i<10;i++){ retrun i; } return result; }
闭包只能取得包含函数中任何变量的最后一个值,闭包保存的是整个变量对象,而不是变量的值
这个函数会返回一个数组,表面上看,似乎每个函数都会返回自己的索引值。但实际上,每个函数都会返回10.因为每个createFunction(0函数活动对象引用的都是同一个变量i。此处的i是闭包的包含函数craeteFunction的局部变量,因为在函数内用var定义的变量是局部变量(注意不用var定义则是全局变量);
那么可以这样使闭包符合预期
function createFunction(){ var result=new Array(); for(var i=0;i<10;i++){ result[i]=function(num){ return function(){ return num; }; }(i); } return result; }
这里没有把闭包直接赋值给数组,而是定义了一个立即执行函数,将其赋值给了数组,给立即执行函数传入实参i,由于函数参数按值传递,在立即执行函数内部以形参num来保存变量i的当前值。在匿名执行函数内部又有一个闭包来返回num的值。这样result数组中的每个函数都有一个num变量的副本来保存着i的值,这样就可以正确返回了
对上面的代码进行如下调用
var a=createFunction(); alert(a[8]());
将createFunction函数的返回值即result数组赋值给a,然后利用a对立即执行函数result[i]=function(num){… }(i)进行调用,注意要写成a8这个函数才能被调用,[]中的值作为i值传入立即执行函数,然后num把当前i的值保存,最后return出来,结果如下
相关文章推荐
- Javascript高级程序设计第二版第四章--变量,作用域及内存问题--笔记
- javascript高级程序设计(第3版) 读书笔记2 变量,作用域 内存问题
- javascript高级程序设计笔记(第4章 变量、作用域和内存问题)
- JavaScript高级程序设计之函数表达式之闭包之闭包与变量第7.2.1讲笔记
- 关于帝国标签变量带入javascript中出现的问题
- javascript中运用闭包和自执行函数解决大量的全局变量问题
- javaScript高级教程(九) ------javascript对象字面量--------困扰已久的问题
- 关于JavaScript的全局变量的问题
- JavaScript高级程序设计学习笔记--变量、作用域和内存问题
- 学习 javascript高级程序设计 (第3版)-- 变量、作用域、内存问题
- 关于变量为Javascript关键字的问题
- JavaScript高级程序设计学习总结二(JavaScript复杂的变量与内存问题)
- JavaScript高级程序设计之变量、作用域和内存问题之执行环境及作用域第4.2讲敏敏笔记
- javascript中运用闭包和自执行函数解决大量的全局变量问题
- JavaScript中关于var以及变量问题
- Javascript高级程序设计第二版第四章--变量,作用域及内存问题--笔记
- Javascript高级程序设计第二版第四章--变量,作用域及内存问题--笔记
- Javascript与ASP.NET(一般处理程序)关于URL(get方式)传递中文乱码问题的解决方案
- javaScript 关于闭包问题
- Javascript与ASP.NET(一般处理程序)关于URL(get方式)传递中文乱码问题的解决方案