自我学习——javascript——函数表达式

  1.函数闭包

    闭包:闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式,就是在一个函数内部创建另一个函数  

    基础:和构造函数的propertype类似,函数的变量也有一个作用域链,这个作用域链的话也是指向本函数的活动变量排在第一位,其次是外部函数,再外部函数。。。。。。直到作用域执行环境的全局函执行环境(这个是一直存在的),所以,和propertype一样,如果出现同名参数,也是最先访问的是函数内部的值(注意:argument,this是创建函数就会有的,所以不可能访问到外部函数的这两个变量)

        var xiaosi=1;
        
        function creat(xiaosi){
            xiaosi=2;
            alert (xiaosi);
        }
        
        creat();                //2
        alert(xiaosi);          //1

而会先显示2然后显示1的原因就是因为在函数内部访问的xiaosi变量不是全局的,只是creat函数内部变量,所以优先访问内部变量,全局的是没有变的(类似prototype和父类同名的情况)

  2.this对象

  基础:this对象时在运行时基于函数的执行环境绑定的,全局函数中,this等于window,而函数被当做某个对象的方法的时候,this等于那个方法,不过,匿名函数的执行环境具有全局性,因此this对象通常指向window。

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

显示 “the window”原因是因为 object.getNameFunc 返回的是一个匿名函数,具有全局性,匿名函数的this为widow。

this和arguments在用匿名函数返回的时候需要注意必须把这个对象放在一个闭包能够访问到的变量中:

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

类似这里放在that里

   3.闭包内存泄露(ie6,ie7,ie8)

    因为在ie6,7,8中JScript和COM对象使用不同的垃圾收集装置,因此闭包在ie这些版本会导致——如果闭包的作用域链中保存一个html元素,那么这个元素将无法被销毁

   

function assignHandler(){
        var element=document.getElementById("someElement");
        element.onclick=function(){
            alert(element.id);
        }        
    }
    assignHandler();

由于匿名函数对element引用了,在引用计数里面记数至少都是1,所以这个内存销毁不掉。需要销毁的话:

    function assignHandler(){
        var element=document.getElementById("someElement");
        var id=element.id;
        
        element.onclick=function(){
            alert(id);
        }        
        
        element=null;
    }
    assignHandler();

设置一个新的变量保存dom对象,然后再把这的dom原来保存位置释放

 4.模仿块级作用域

 通过匿名函数

    (function(){
        //这里是块级作用域
    })();

这个方式是通过直接声明并立即调用一个匿名函数(js原本就是函数作用域)。通过这个方式实现内部的东西不能被外部访问,如果要访问的话就需要内部提供对应的接口

5.私有变量

  创建一个私有变量的对象需要对构造函数进行一些更改

        var singleton=function(){
            var privateVariable=10;
            
            function privateFunction(){
                return false;
            }
            
//            var object=new CustomType();
            
              var object=new Object();
            
            object.publicProperty=true;                       
            
            object.publicMethod=function(){
                privateVariable++;
             return    privateVariable;
            }
            return object;
        };
    
    var xiaosi=new singleton();

因为函数外部是不能访问函数内部的变量的,所以在函数内部实例化一个对象,对象里面含有对函数内部的属性访问的方法,然后返回这些方法,就可以实现对私有属性的访问,但是这种方式是很消耗内存的,因为都要实现返回的方法

原文地址:https://www.cnblogs.com/yansi/p/3208532.html