循序渐进理解javascript闭包
2015-03-19 17:52
239 查看
需求:我们想要一个这样的数组 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”。
注意: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闭包(closure)
- 深入理解JavaScript闭包(closure)
- 深入理解Javascript闭包
- javascript闭包的理解
- javascript闭包 js闭包理解 高级JS程序员的必经之路。
- 理解javascript闭包
- 理解javascript闭包
- 深入理解javascript闭包【整理】
- 最简单的例子理解Javascript闭包
- 深入理解Javascript闭包(closure) [转载]
- 深入理解JavaScript闭包(closure)
- 一些关于javascript闭包和this的理解
- JavaScript闭包的深入理解
- 深入理解JavaScript闭包
- JavaScript闭包的简单理解
- 深入理解JavaScript闭包(Closures)
- 深入理解javascript闭包