JavaScript闭包

一、首先是两个基本概念:

匿名函数自执行函数 / 立即执行函数 / 自调用函数

匿名函数的基本形式:


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

一些加深理解的题目:
闭包的两个经典例子

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值