变量名提升,闭包的功能和使用

一、变量名的提升

  JavaScript运行中会经过代码的预解析和代码执行过程。

  var num=123;

  function foo(){

    console.log(num);       //undefined

    var num=456;

    console.log(num);   //456

  }

  foo();

  代码预解析过程会将变量声明和函数声明提升。如下:

  var num;

  function foo(){

    var num;

    console.log(num);   //这里因为num只声明了,但是没有定义所以打印是undefined,并且这里找到的是函数foo中声明的变量,不是全局中的num。

    num=456;

    console.log(num);   //这里由于给num赋值为456,所以打印456

  }

  num=123;

  foo();

二、闭包的使用和功能

  ①闭包是为了实现私有访问的函数。

  ②写一个函数内定义一个新的函数,返回新函数,用新函数获得函数内的数据。

  ③写一个函数内定义一个对象,对象中绑定了多个函数,返回对象,利用对象的方法访问函数内的数据。

  ④过多使用闭包会造成内存泄漏,所以,当我们不再使用一个闭包的时候,将其赋值为null。

  1、返回对象来达到获取函数内部的数据,并且修改:

  function foo(){

    var num=Math.random();

    return {

      get_num:function(){

        return num;  

      },

      set_num:function(value){

        num=value;

      }

    };

  }

  var o=foo(); 

  var num1=o.get_num();
  var num2=o.get_num();
  console.log(num1);   //a,a代表随机数,下面的a表示相同的随机数
  console.log(num2);  //a
  num1=o.set_num(5);   //这里调用修改了num1作用域链中的数据,但是num2和num1是两条不同的作用域链,因此,num2中的数据没有发生变化。
  console.log(num1);     //5
  console.log(num2); //a
上面这个功能不使用对象也能完成:
function foo(){
  var num=Math.random();
  return function(value){
    if(value){
      num=value;
      return num;
    }else{return num;}
  }
}
var o=foo();
var num1=o();
var num2=o();
console.log(num1);
console.log(num2);
num1=o(5);
console.log(num1);
console.log(num2);
结果与上面返回对象一样。
posted @ 2018-12-06 23:57  秋华啦啦  阅读(408)  评论(0编辑  收藏  举报