好!欢迎访问迷津渡口 现在时间是:

迷津渡口

越感到迷惑 越接近真理

javascript中私有变量,特权函数和闭包详解

开篇立原则:

1.javascript中一切都是对象。
2.对象的私有变量或函数里的局部变量与世隔绝。
3.函数可为右值。
4.函数执行环境可保存。
5.函数普通返回值为值传递。

对象私有变量和特权函数

在对象构造函数或者方法里面出现的局部变量就是对象的私有变量。

这些私有变量和私有属性或普通属性不同,无法通过对象直接获取,形成一种与世隔绝的状态。

私有变量只能通过定义特权方法函数获取和修改。

例子:

function Test(propertyA) {
    // 普通属性propertyA
    this.propertyA=propertyA;
    // 普通属性设置方法
    this.setPropertyA=function(pushA) {
        this.propertyA=pushA;
    };
    // 普通属性获取方法
    this.getPropertyA=function() {
        console.log(this.propertyA);
    };
    
    // 私有变量localPropertyB
    var localPropertyB='secret';
    // 配置特权方法设置私有变量localPropertyB
    this.setLocalPropertyB=function(pushB) {
        localPropertyB=pushB;
    };
    // 配置特权方法获取私有变量localPropertyB
    this.getLocalPropertyB=function() {
        console.log(localPropertyB);
    };
}
// 实例化对象
var test=new Test('normal');
// 直接利用对象获取普通属性
console.log(test.propertyA);
// 直接利用对象修改普通属性
test.propertyA='new normal';
// 直接获取修改后的属性
console.log(test.propertyA);
// 利用对象方法修改普通属性
test.setPropertyA('new new normal');
// 利用对象方法获取普通属性
test.getPropertyA();

// 尝试利用对象获取私有变量
// 当然不行,句点.符号只能获取属性
// test对象没有localPropertyB属性
// 因此只能输出undefined喽
console.log(test.localPropertyB);
// 利用对象的特权方法获取对象的私有变量
test.getLocalPropertyB();
// 利用对象的特权方法修改对象的私有变量
test.setLocalPropertyB('new secret');
// 再次利用特权方法获取修改后的私有变量
test.getLocalPropertyB();

结果为:

normal
new normal
new new normal
undefined
secret
new secret

利用对象中私有变量这种与世隔绝的状态,我们可以定义隐藏变量,只可以通过接口特权函数获取和修改。

函数局部变量和闭包

相对于对象的构造函数里的私有变量,普通函数里面的局部变量同样具有与世隔绝的状态。

此时可以利用所谓的闭包获取和修改局部变量,从而作出相应不同的处理。

先上三个例子,总结在后面~

例一:在闭包函数里直接同时修改和获取局部变量

function test() {
    var x = 1;

    function setGetX() {
      	++x;
      	console.log(x);
    }

    return setGetX;
}
var outTest=test();
outTest();
outTest();
var outTest1=test();
outTest1();
outTest();
outTest();
outTest1();

结果为:

2
3
2
4
5
3

例二:在闭包函数里利用私有函数同时修改和获取局部变量

function test() {
    var x = 1;

    function setX() {
        ++x;
    }

    function getX() {
        console.log(x);
    }
    function setGetX() {
      	setX();
       	getX();
    }

    return setGetX;
}
var outTest=test();
outTest();
outTest();
var outTest1=test();
outTest1();
outTest();
outTest();
outTest1();

结果为:

2
3
2
4
5
3

例三:根据参数获取不同闭包函数分别修改和获取变量

function test(type) {
    var x = 1;
    
    function setX() {
        ++x;
    }
    
    function getX() {
        console.log(x);
    }
    
    return (type === 'set')?setX:getX;
}
var outSetTest=test('set');
var outGetTest=test('get');
outGetTest();
outSetTest();
outGetTest();

结果为:

1
1

例子总结:

1.闭包可以保留函数的执行环境,包含变量和引用的局部函数环境。
2.同一个实例化的闭包可以修改局部变量并不断累积,此时的局部变量具有类似static静态变量的效果。
3.不同实例化的闭包之间互不影响,修改的局部变量也不会互相影响。


小指才疏学浅,任何不妥之处,请不吝赐教~

点赞2
   支持一下
挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
 点赞
 签到
 表情
 图片
 代码
提交评论

清空信息
关闭评论
 00:00/00:00
我想和你虚度时光 - 花房姑娘(9)
  1. 恋恋风尘
  2. 恋恋风尘
  3. 恋恋风尘
  4. 恋恋风尘
  5. 恋恋风尘
  6. 恋恋风尘
  7. 恋恋风尘
  8. 恋恋风尘
  9. 恋恋风尘