闭包

来源:互联网 发布:莉莉柯林斯长相知乎 编辑:程序博客网 时间:2024/05/25 01:36
/* 当在函数内部定义了其他函数时,就创建了闭包。闭包有权访问包含函数内部的所有变量,原理如下:   * 在后台执行环境中,闭包的作用域链包含着它自己的作用域、包含函数的作用域和全局作用域   * 通常,函数的作用域及其所有变量都会在函数执行结束后被销毁   * 但是,当函数返回了一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止。*/    /*使用闭包可以在javascript中模仿块级作用域(js本身没有块级作用域的概念),要点如下:    * 创建并立即调用一个函数,这样既可以执行其中的代码,又不会在内存中留下对改函数的引用。    * 结果就是函数内部的所有变量都会被立即销毁--除非将某些变量赋值给了包含作用域(即外部作用域)中的变量*/    var name = "The Window";    var object = {        name:"My Object",        getNameFunc:function(){            console.log(this);//object            return function () {                console.log(this);//window                return this.name;            }        }    }    console.log(object.getNameFunc());//function(){console.log(this);return this.name;}    console.log(object.getNameFunc()());//The Window    var name = "The Window";    var object = {        name:"My Object",        getNameFunc:function(){            var that = this;            console.log(that);//object            return function () {                console.log(that);//object                return that.name;            }        }    }    console.log(object.getNameFunc()());//My Object    /*javascript中的函数表达式和闭包都是及其有用的特性,利用他们可以实现很多功能。不过,因为创建闭包必须维护额外的作用域,所以过度使用他们可能会占用大量的内存*/    function assignHandler(){        var element = document.getElementById("someElement");        element.onclick = function () {            alert(element.id);        }    }    function  assignHandler(){        var element = document.getElementById("someElement");        var id = element.id;        element.onclick = function () {            alert(id);        }        element = null;    }

原创粉丝点击