JavaScript闭包

来源:互联网 发布:vscode 运行npm命令 编辑:程序博客网 时间:2024/05/30 04:16

JavaScript闭包

闭包是指有权访问另一个函数作用域中的变量的函数。


创建闭包

创建闭包的常见方式就是在一个函数内部创建另一个函数

function createComparisonFunction(propertyName) {  return function(object1, object2) {    var value1 = object1[propertyName];    var value2 = object2[propertyName];    if (value1 < value2) {      return -1;    } else if (value1 > value2) {      return 1;    } else {      return 0;    }  };}

其中,这两行代码是内部函数(一个匿名函数)中的代码,这两行代码访问了外部函数中的变量propertyName

var value1 = object1[propertyName];

var value2 = object2[propertyName];

能够访问这个变量的原因是:内部函数的作用域链中包含createComparisonFunction的作用域。

在匿名函数从createComparisonFunction()中被返回后,它的作用域链被初始化为包含createComparisonFunction函数的活动对象和全局变量对象。

createComparisonFunction函数在执行完毕后,其执行环境的作用域链会被销毁,但它的活动对象仍然会留在内存中。直到匿名函数被销毁后,createComparisonFunction的活动对象才会被销毁。

//创建函数var  compareNames = createComparisonFunction("name");//调用函数var result = compareNames({ name: "Nicholas"}, { name: "Greg"});//解除对匿名函数的引用(以便释放内存)compareNames = null;

闭包与变量

闭包所保存的是整个变量对象,而不是某个特殊的变量。

function createFunctions(){  var result = new Array();  for (var i = 0; i < 10; i++) {    result[i] = function () {      return i;    };  }  return result}//result里的值全为10

通过创建另一个匿名函数强制让闭包的行为符合预期。

function createFunctions(){  var result = new Array();  for (var i = 0; i < 10; i++) {    result[i] = function (num) {      return function(){        return num;      };    }(i);  }  return result;}console.log(createFunctions()[3]());//3

关于this对象

this对象通常指向全局对象。 把外部作用域中的this对象保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象了。

var name = "The Window";var object = {  name: "My Object",  getNameFunc: function() {    var that = this;    return function() {      return that.name;    };  }};console.log(object.getNameFunc()());//"My Object"
原创粉丝点击