循序渐进理解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”。






0 0