一、首先是两个基本概念:
匿名函数 和 自执行函数 / 立即执行函数 / 自调用函数
匿名函数的基本形式:
function () {
//代码
}
既然没有名字,那么如何调用呢:
(1)将匿名函数付给一个变量,这个变量现在就充当了这个函数的名称,但是记住,这个不是名称,在用该变量时就等同于使用该函数。
var b=function () {
//代码
}
b();
(2)使用自执行函数,自执行函数的基本形式:
(function(){
//代码
})();
自执行函数相当于第一种方法两步的结合。
关于自执行函数
为什么(function() {// code})();
可以被执行, 而function() {// code}();
却会报错?
分析:
(1). 首先, 要清楚两者的区别:
(function() {// code});
是表达式,function() {// code};
是函数声明.
(2). 其次, js"预编译"的特点:
js在"预编译"阶段, 会解释函数声明, 但却会忽略表达式.
(3). 当js执行到function() {//code}();
时, 由于function() {//code}
在"预编译"阶段已经被解释过, js会跳过function(){//code}
, 试图去执行();
, 故会报错;
而当js执行到(function {// code})();
时, 由于(function {// code})
是表达式, js会去对它求解得到返回值, 由于返回值是一 个函数, 故而遇到();时, 便会被执行.
注意:
// return fun2 ;
//return fun2() ;
两者区别就是return fun2();返回一个函数值,而 return fun2; 则是返回函数本身(返回函数,就是打印函数体)
二、理解下面代码
代码1:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());
运行结果:The Window
在getNameFunc()函数中,返回的是一个匿名函数,而在匿名函数中的return this.name语句中,this指的是全局环境中的window,因而结果为"The Window"
(1)在一般情况下,this对象时在运行时基于函数的执行环境绑定的:
在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。
但是,匿名函数的执行环境具有全局性,因此它的this对象通常指向windows.
(2)var a={}; new Object();
两者都表示定义一个空对象;
new Array();var a=[];
表示定义一个空数组;
参考文章:浅谈Javascript的匿名函数中的this对象
代码2:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());
运行结果:My Object
该代码在匿名函数外声明一个变量,将this赋给变量,因为在匿名函数外的this就等于该对象,从而匿名函数中的this,指向的是当前的Object对象。
综合两段代码:什么在代码:1种this指的是全局而不是当前对象object?
解析:代码1中的闭包函数并未实例化,是作为全局普通函数调用的,因而this指针指向windows,而在代码2中,在闭包函数之外的父函数事先定义了this,在此中调用的函数便是对象的一个属性,因而此中this指向的是当前对象object。
参考文章:深入理解javascript原型和闭包——this
关于闭包的练习:
(1)
function outerFun()
{
var a=0;
function innerFun()
{
a++;
alert(a);
}
}
innerFun();//错误代码!innerFun()的作用域在outerFun()内部,所在outerFun()外部调用它是错误的。
正确的闭包写法:
function outerFun()
{
var a=0;
function innerFun()
{
a++;
alert(a);
}
return innerFun; //注意这里,将闭包函数返回,从这里可以访问上层函数的内部变量
}
var obj=outerFun();
obj(); //结果为1
obj(); //结果为2
var obj2=outerFun();
obj2(); //结果为1
obj2(); //结果为2
一些加深理解的题目:
闭包的两个经典例子