您的位置:首页 > Web前端 > JavaScript

js-闭包原理

2015-08-24 18:06 621 查看
写在前面:

    js变量作用域:全局变量和局部变量

    函数内部可以读取全局变量

    函数外部无法读取函数内部的局部变量

    函数内部用var关键字定义的变量为局部变量,否则为全局变量

如何在函数外部读取局部变量?

function f1(){
  var n=999;
  function f2(){
    alert(n); // 999
  }
}在函数里定义一个全局函数f2,就通过调用f2(),读取到f1中的局部变量n了。

闭包

描述:

    上述f2即是闭包,可以把闭包简单理解成"定义在一个函数内部的函数",闭包就是将函数内部和函数外部连接起来的一座桥梁。

特点:

    上述f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。因为f2是全局变量,一直存在于内存当中,而f2的存在依赖于f1,因此f1也一直存在于内存中。

用处:

    一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

注意:

    由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

    闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

例子1:

var name = "The Window";
var object = {
  name : "My Object",
  getNameFunc : function(){
    return function(){
      return this.name;
    };
  }
};
alert(object.getNameFunc()()); // 提示"The Window"解释:getNameFunc函数返回的是匿名函数,它是一个全局函数,父对象是window而不是object,因此输出了全局变量name(”The Window“)

例子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"解释:getNameFunc函数中定义了一个局部变量that,而that赋值this,即把getNameFunc这个对象赋给了that。然后返回的函数是全局函数,是一个闭包,它在getNameFunc里面,因此能读取that这个局部变量,因此that.name提示”My Object“

同样简单的例子有:

var array = ["Hello", "world", "javascript"];
$.each(array, function() {
console.log(this.length);
});其中匿名函数function也就是闭包,this指的就是遍历得到的元素对象本身。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript 闭包