JavaScript中的变量范围以及闭包的概念

JS变量的作用域:在JS中当在外面定义一个变量时,例如var a=3;这便是一个全局变量。

当在函数中定义一个变量时,

例如function(){

  var a=10;

  那么这就是一个局部变量,并且该变量只能在该函数中起作用。

  当我不定义类型时:a=10;(那么它就是一个全局变量)

闭包的概念及作用:闭包在我理解就和java中的get方法一样,是用来获取其他函数中的内部变量的函数。

由于在JavaScript中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。

所以本质上闭包就是函数内部和函数外部连接起来的一座桥梁。

闭包的另一个作用:可以让这些值始终保存在内存中。

事例:

//****JavaScript闭包*******
    var a=22;//在JS中是全局变量
    function fun(){
        alert(a);
    }
    fun();//输出结果是22
    
    function fun2(){
        //var b=11;//私有变量
        c=12;//公有变量
    }
    fun2();
    //alert(b);//获取不到b,无法输出,会报错
    alert(c);
    
    //闭包
    function fun3(){
        var d=99;
        function fun4(){
            return d;//通过fun3中的私有方法访问其父类的所有变量,以获取并返回
        }
        
        return fun4;//把fun4返回出去,间接获取返回的私有变量d的值
    }
    var e=fun3();
    alert(e());

//JavaScrip中的闭包
    var name="The window";//定义全局变量
    
    var object={//定义一个名为object对象
        name:"The object",//定义其name属性,值是The object
        getNameFun:function(){//定义其getNameFun属性,值是一个function()
            return function(){
                return this.name;//这里的this是指的window对象,所以name值就是The window
            };        
        }
    };
    alert(object.name);//结果是The object
    alert(object.getNameFun()())//object.getNameFun()是获取其该属性的值,要想执行其中方法就要在后面加一个()
    //结果是The window

闭包使用时的注意点:

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

2.闭包会在父函数外部,改变父函数内部的值。所以你把父函数当做对象使用,把闭包当做它的公用方法,把内部变量当做它的私有属性时,一定要注意,不要随便改变父函数内部变量的值。

原文地址:https://www.cnblogs.com/AnswerTheQuestion/p/6400797.html