javascript中的闭包概念简单介绍

快乐打工仔 分类:实例代码

所谓的闭包应该是指: 内部函数读取当前函数以外的变量,即创建时所处的上下文环境。

function hello(){
  var char = "pipipi.net";
  function print(){
    console.log(char);
  };
  return print();
}

需要注意的是这里的print函数引用了外部hello函数的char变量,于是在这里我们能够返回"pipipi.net"。

这个功能在某种意义上来说,是要归功于作用域。我们没有办法直接访问char,除非是声明这个变量的时候没有带var。

代码实例如:

function hello(){
  char = "pipipi.net";
  function print(){
    console.log(char);
  };
  return print();
}

在这里hello变成一个闭包。 闭包是一种特殊的对象,它由两部分构成:函数,以及创建该函数的环境。环境由闭包创建时在作用域中的任何局部变量组成。

Javscript闭包与this:

需要注意的是读取this与arguments时,可能是会出问题的。

function hello(){
  this.char = "pipipi.net";
  function output(){
    char = "antzone";       
    console.log(this.char);
  };
  return output();
}

当然了这个例子并不够贴切,我们需要一个额外的例子来解释这个问题,下面引用一个《Javascript高级程序设计》中的一个例子,来说明这个问题。

var name = "The window";
var object = {
  name: "My Object",
  getNameFunc: function(){
    return function(){
      return this.name;
    }
  }
};
object.getNameFunc()()

只是这种用法实在是,而解决方法便是保存一个临时变量that,如之前在《关于Javascript的this的一些知识》一文中所说的。

var name = "The window";
var object = {
  name: "My Object",
  getNameFunc: function(){
    var that = this;
    return function(){
      return that.name;
    }
  }
};
object.getNameFunc()()

Javscript 闭包与读写变量:

值得注意的是,如果我们没有处理好我们的变量时,我们也可以修改这些变量。

function hello(){
  var char = "hello,world";
  return{
    set:function(string){
      return char = string;
    },
    print: function(){
      console.log(char)
    }
  }
}
var say = hello();
say.set('new hello,world') 
say.print() // new hello world

Javascript 闭包与性能:

引用MDC的说法:

如果不是因为某些特殊任务而需要闭包,在没有必要的情况下,在其它函数中创建函数是不明智的,因为闭包对脚本性能具有负面影响,包括处理速度和内存消耗。

javascript中的闭包概念简单介绍

回复

我来回复
  • 暂无回复内容