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.不同实例化的闭包之间互不影响,修改的局部变量也不会互相影响。
小指才疏学浅,任何不妥之处,请不吝赐教~
点赞3
支持一下