javascript 闭包

1.闭包是什么?

理解:个人理解为一个函数中去使用其他一个或者多个函数内部的变量

定义:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数

作用:读取他函数内部的变量以及保存这些变量(不让其销毁,但可能带来了内存泄漏问题)

2.理解下javascript变量的作用域:

简单划分为全局作用域(global document),函数作用域(可以理解局部作用域,自己定义的一些函数内部的变量)

函数内部可以使用全局变量(注意:函数内部变量的声明必须使用var,否则系统默认为全局变量),而函数外部是不可以调用函数内部变量的,这就是作用域链。

同时闭包的返回值一定是全局的,否则无法保存下来。如果想用this,需要that=this搞过来一下。

3.代码跑起来:

var a=1;
  function f(){
    alert(a);
  }
  f(); // 1   这段代码说明函数内部可以使用全局变量的

4.代码跑起来:

function f(){
    var a=1;
}
alert(a); // error

这段代码说明函数外部无法使用函数内部的局部变量

5.如何在函数外部正确使用函数内部变量 ???

简单的方法就是在内部函数外层再定义一层函数,并将内层函数return出去!

6.代码跑起来:

 function f1(){

    var a=1;

    function f2(){
      alert(a); 
    }

    return f2;

  }

  var r=f1();//此时函数值发生变化指向了f2

  r(); // 1

7.代码跑起来:

function f1(){
    var n=1;
    add=function(){n+=1}
    function f2(){
      alert(n);
    }
    return f2;
  }
  var r=f1();
  r(); // 1
  add();
  r(); // 2
可以理解为r现在指向为f2函数,并且他执行了两次!其中add是运算加和!

8.代码跑起来:


function f1(){
   var n=1;
   add=function(){
         n+=1 ;
         alert(n)
   }
    return add;
    function f2(){
         alert(n);
    }
    return f2;
}
var r=f1();
r()//2
r();//3
解释器解释js 从上到下 ,return结束执行
此时因为return了add,下面不在执行!

9.代码跑起来:

function f1(){
    var n=1;
    add=function(){
           n+=1 ;
           alert(n)
       }
    function f2(){
      alert(n);
    }
    return f2;
  }
  var r=f1();
    r()1
     add();2
      r();2

为什么是两个2
不要奇怪因为有一个是add中alert()输出2!

10.代码跑起来:

function f1(){
    var n=1;
    add=function(){
          n+=1 ;
       }
    function f2(){
      alert(n);
    }
    return f2;
  }
  var r=f1();
   r() //1
     add() //只让他做运算
     r(); //2

删除add中alert(),这次只有一个2输出

11.代码跑起来:

var name = "Window";
  var obj = {
    name : "My",
    getName : function(){
      return function(){
        return this.name;
      };
    }
  };
  alert(obj.getName()()); //windows

此时return回来的函数已经不再是obj的属性,返回的是一个为执行的函数表达式,
所以这是this指向全局函数(window)
不相信的的小朋友可以 alert 一下obj.getNAme()函数。
里面一定是function(){return this.name;};

12.代码跑起来:

var name = "Window";
  var object = {
    name : "My",
    getName : function(){
      var that = this;
      return function(){
        return that.name;
      };
    }
  };
  alert(obj.getName()());//my
此时改变了this指向 输出my

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值