Loading

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
posted @ 2018-10-19 00:12  未夏  阅读(340)  评论(0编辑  收藏  举报