js中的作用域及私有变量

js中实现作用域的方法很简单,就是一个自调用函数

(function(){
//这就是一个作用域了
for(var i = 0 ; i < 10 ; i++){
console.log(i);
}
})()
//这个i就只能在里面访问,要是不加这个作用域i就是全局的了

下面就要使用作用域和闭包来实现私有变量了
1.function Person(value){
var age=value;
this.getAge=function(){
return age;
}
}
var p1=new Person(12);
console.log(p1.getAge());//12
注:这样写就能实现age的私有化,在外面是无法访问到的,只有通过getAge这个接口才能访问,在一个function中只要是为this添加的属性,在实例化的时候都能够在外部访问到,只有使用var 声明的函数内部变量外不是访问不到的,这种方法虽然能实现私有变量,但是getAge这个方法会在每次的实例化的时候被创建,虽然每个实例都一样,当然把公共方法赋给原型不就可以使用公用的函数了吗,但是在这样的实现中是不行的,因为原型中也无法访问到age这个属性,也就没办法返回值了,所以有了以下的方法


2.(function(){
var age;
Person =  function(value){
   age=value;
      }
Person.prototype.getAge(){
return age;
}
   })()
   var p1=new Person(12);
   p1.getAge();

注:在这种方法实现中使用一个自调用函数作为块级作用域,外面就无法访问到里面的age属性,因为Person不是用var 定义的,而且他是一个函数表达式,所以Person就是一个全局的接口,在外部就能够调用,而Person在块级作用于里面,所以根据闭包的性质它和它的原型就能够访问到age属性,而原型的使用使得创建实例的时候不会重复创建getAge方法

//下面是同一种思想的另一种实现
var createPerson=function(age){
var age;
function Person(value){
   age=value;
      }
Person.prototype.getAge(){
return age;
}
return new Person(age);
}
var p1=createPerson(13);
p1.getAge();//13

这和上面一种方法思想是一样的,都是使用一个块级作用域来实现私有变量,然后再原型中保存公共方法,不同的只是提供接口的方式,这里使用了类工厂的模式返回一个Person对象

3.模块模式(单例模式实现私有变量)
var Person=(function(){
var property1=property1;
var property2=property2;
function fn1(){}
function fn2(){}
return{
property1:property1,
property2:property2,
fn1:fn1,
fn2:fn2
}
})();
Person.fn1();
//注:使用一个自调用函数返回一个包含所需方法的对象,里面的方法外面无法直接访问,只能通过返回的对象接口来访问。

最后说一句:以上内容来自JavaScript高级程序设计(第三版),加上自己的一些理解,不到之处请多指出,谢谢!!











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值