循序渐进理解javascript闭包
来源:互联网 发布:老虎机的内部算法 编辑:程序博客网 时间:2024/05/16 09:23
需求:我们想要一个这样的数组 array[0] = 0,array[1] = 1............一直持续到...............array[9] = 9
注意:1:基本类型是按值传递(在栈内存运行),引用类型是传递引用,就是传递内存地址或传递指针的意思(在堆内存运行)。
2:函数的参数是按值传递。
方法一:
在createFunctions()里,通过for循环给数组挨个赋值。然后返回数组。
最后在浏览器里通过for循环打印数组的值。打印出的数组效果是符合需求的。
这个数组是一个数字数组[0,1,2,3,4,5,6,7,8,9]
方法二:
这个写法,我们就发现打印出来的数组值全是-1。
分析:我们一定要注意,array[i]是一个匿名函数。函数是引用类型,是需要传递引用的。
我们可以这么去理解
var array[i] = function(){
return i;
};
我们分开来开,i从9到-1,array[i]就分别表示了这个数组里边的元素。但是这个数组的元素分别是同一个函数,即函数function(){return i;}
也就是说 array[i]分别等于同一个引用,那么在这个循环结束后,这个函数(或这个引用的返回值等于-1),也就是array[i]等于同一个值。
所以,最后我们会发现,这个数组是一个函数数组,数组中的每一个数组值都是等于-1。
方法三
同样的这个array[i]是一个函数,这个数组是一个函数数组。
我们可以这么去理解
var array[i] = function(j){
return j;
};
所以这个函数的调用是需要传递一个参数的 。函数的参数是按值传递的,按值传递就是传递这个值的副本,也就是说j也是从9.....一直到......-1的。
所以最后我们会发现打印出来是符合需求的。
方法四:
最后这个用到了闭包,闭包可以这么去简化理解,就是函数里边再来个函数。
result[i]是一个隐函数
var result[i] = function( num ){
//code here
}(i);
一定要注意这个隐函数是需要传递一个参数的,我们可以这么去理解
result[i](i)运行了这个函数。也就是运行了如下的函数
function ( i ){
return function(){
reurn i;
}
}
这个函数接受一个按值传递来的i值,然后返回一个函数(或者交返回一个引用,这是按引用传递的),这个返回的函数的值(或者返回的这个引用)等于传递进来的i。
记住 参数是按值去传递的。所以最后的打印结果是符合要求的。
最后在说点帮助对闭包的理解
这个肯定是理解。我就直接略过。。。。
我们来看看这个,这个要好好理解。。。。
我们这样去理解,object.getName()这个函数是在object这个对象里边的。
但是这个函数不是直接返回一个值,而是返回了一个函数,这个被返回的函数会被返回到全局作用域里。所以这个this 这个时候是指的“the window”。
- 循序渐进理解javascript闭包
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- javascript 闭包理解
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- 理解 JavaScript 闭包
- 理解JavaScript 闭包
- 理解javaScript闭包
- javascript理解-闭包
- javascript闭包理解
- javascript 闭包 理解
- Mac 如何卸载canopy
- eclipse Gradle插件null see error log...
- sql 添加字段备注和查看已添加表的备注
- 【斜率优化dp】HDU3669 Cross the Wall
- 分割流、合并流
- 循序渐进理解javascript闭包
- bitmap图片压缩
- svn教程
- 黑马程序员——OC语言------Foundation
- 感想
- selenium webdriver定位不到元素的五种原因及解决办法
- (原创)Centos6.4上用gitolite部署git服务器
- 黑马程序员——JAVA基础---网路编程---概述,UDP/TCP对应Socket,小知识点
- chrome console