zoukankan      html  css  js  c++  java
  • JavaScript函数表达式

    闭包

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

    匿名函数的执行环境具有全局性。外围函数返回的匿名函数仅仅是定义,还尚未执行;函数内部的this对象指向函数据以执行的环境对象,当匿名函数被执行时,返回的匿名函数所处的执行环境是全局环境,故而this指向全局环境的变量对象。

    var name = "Bob";
    
    function out() {
        var name = "Tom";
        
        return function() {
            return this.name;
        }
        
    }
    
    alert(out()()); // Bob
    

    函数表达式

    如果function关键字是语句的开始,则这是一个函数声明。若要将函数声明转为函数表达式只需要用"()"括住函数声明即可。

    私有变量

    任何在函数中定义的变量,都可以认为是私有变量。私有变量包括函数的参数、局部变量和函数内部定义的其他函数。

    特权方法指有权访问私有变量和私有函数的公有方法。

    创建私有变量的常用方法是构造函数模式:

    function Test(name) {
        var age = 24;
        this.sayName = function() {
            return name;
        };
    }
    
    alert(new Test("Tom").sayName()); // Tom
    alert(new Test("Tom").age); // undefined
    

    构造函数内部的age、name是私有变量,不是实例变量(this.valueName),实例方法sayName是特权方法,能够访问name私有变量。

    静态私有变量

    为了解决创建多个实例时会重复创建特权方法的问题,可以:

    1. 在匿名函数表达式中定义私有变量和私有函数
    2. 创建全局变量对象,并用匿名构造函数初始化
    3. 在全局变量的原型中定义公有方法
    (function() {
        var privateValue = 24;
        function privateFunction() {
            alert("Hello,world!");
        }
        
        // 用匿名构造函数初始化全局对象
        Obj = function(){
            
        };
        
        Obj.prototype.publicMethod = function() {
            alert(privateValue);
            privateFunction();
        };
    })();
    
    m = new Obj();
    m.publicMethod();
    

    模块模式

    模块模式是为单例创建私有变量和特权方法。

    所谓单例,指的就是只有一个实例的对象。按照惯例,JavaScript以对象字面量来创建单例对象。

    1. 在匿名函数中定义私有变量和私有函数
    2. 匿名函数返回一个对象字面量形式的对象
    3. 在对象字面量中定义特权方法和公有变量
    (function() {
        var privateValue = 24;
        function privateFunction() {
            alert("Hello,world!");
        }
    
        return {
            publicProperty: "public",
            publicMethod:  function() {
                alert(privateValue);
                privateFunction();
            }
        };
    })().publicMethod();
    

    增强模块模式

    增强模式返回的单例都是Object类型的,如果需要特定类型的单例,可以使用增强模块模式:

    1. 在匿名函数中定义私有变量和私有函数
    2. 在匿名函数中,创建特定类型的单例对象
    3. 为单例对象添加特权方法和公有属性
    4. 返回单例对象
    test = (function() {
        var privateValue = 24;
        function privateFunction() {
            alert("Hello,world!");
        }
        Bob = new Student();
        Bob.publicProperty = "public",
        Bob.publicMethod =  function() {
            alert(privateValue);
            privateFunction();
        };
        return Bob;
    })();
    
    function Student() {
        
    }
    
    test.publicMethod();
    alert(test instanceof Student); // true
    
  • 相关阅读:
    mysql-sql中变量的使用
    group by 几种不同情况下的聚合运算
    idea中git撤回commit内容
    mysql按照指定的顺序排序(order by case when)
    根据字段的不同值进行升序和降序排序
    索引
    idea 新建git分支并提交
    idea 编辑区浏览器图标
    idea 首字母小写的时候没有相关提示
    Excel—分组然后取每组中对应时间列值最大的或者最小的
  • 原文地址:https://www.cnblogs.com/weixia-blog/p/9814022.html
Copyright © 2011-2022 走看看