匿名函数: 创建一个函数并将它赋值给一个变量(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.