闭包与匿名函数

匿名函数: 创建一个函数并将它赋值给一个变量(FunctionName),代码如下:

var name=function()

{

alter("hello!");

};

有一个概念是函数声明提升,即在执行代码之前会首先读取函数声明,如:

                   name();

function  name()

{

alter("hello!");

}

会显示出hello!,但是用匿名函数就不行:

name();

var name=function()

{

alter("hello!");

};

程序会报错

闭包:闭包是指有权访问另一个函数作用域中变量的函数,即在一个函数中创建另一个函数

function a(i){

  function b(){

    alert(++i);

  }

return b;

}

a(1);

这段代码创建了一个闭包,在函数a中定义的函数b会将其包含函数的活动对象添加到其作用域链中。

当函数b在函数a中被返回时,b的作用域链为包含a的活动对象和全局变量的活动对象。即可以访问a中定义的变量和全局变量,此时++i中i的值为1,函数b会返回2。重要的是函数a在执行完毕后其活动对象不会被销毁,因为函数b的作用域链依然包含a的活动对象。一直到函数返回2时候,函数a的活动对象才会被销毁。

有一个值得注意的问题。作用域链这种配置机制会引出一个副作用,即闭包只能取得包含函数中任何变量的最后一个值。

functiuon  a(){

var result=new Array();

for(var i=0;i<10;i++)

{

result[i]=function(){

return i;

};

}

return result;

}

按道理说,匿名函数会返回每个索引值从0到9,但是由于其特殊属性,每次I都是返回10。

that's all.





猜你喜欢

转载自blog.csdn.net/greedy__/article/details/78883555