深入理解JavaScript中的块级作用域、私有变量与模块模式

本文详细的介绍了JavaScript中的块级作用域、私有变量与模块模式,废话就不多说了,具体如下:

1.块级作用域(私有作用域),经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。

(function(count){
  for(var i=0;i<count;i++){
    console.log(i);//=>0、1、2、3、4
  }
  console.log(i);//=>5
})(5); 
(function(){
  var now=new Date();
  if(now.getMonth()==0 && now.getDate()==1){
    console.log("新年快乐");
  }else{
    console.log("尽情期待");
  }
})(); 

 2.私有变量:任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数的外部访问这些变量。

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

2.1)在构造函数中定义特权方法:

 function Person(name){
  this.getName=function(){
    return name;
  };
  this.setName=function(value){
    name=value;
  };
}
var person1=new Person("Jason");
console.log(person1.getName());//=>Jason
person1.setName("gray");
console.log(person1.getName());//=>gray
var person2=new Person("Michael");
console.log(person1.getName());//=>gray
console.log(person2.getName());//=>Michael
person2.setName('Alex');
console.log(person1.getName());//=>gray
console.log(person2.getName());//=>Alex 

构造函数模式的缺点是针对每个实例都会创建同样一组新方法。

2.2)静态私有变量来实现特权方法

在私有作用域中,首先定义私有变量和私有函数,然后定义构造函数及其公有方法。

 (function(){
  //私有变量和函数
  var name="";
  Person=function(value){
    name=value;
  };
  //特权方法
  Person.prototype.getName=function(){
    return name;
  };
  Person.prototype.setName=function(value){
    name=value;
  }
})();
var person1=new Person("Jason");
console.log(person1.getName());//=>Jason
person1.setName("gray");
console.log(person1.getName());//=>gray
var person2=new Person("Michael");
console.log(person1.getName());//=>Michael
console.log(person2.getName());//=>Michael
person2.setName('Alex');
console.log(person1.getName());//=>Alex
console.log(person2.getName());//=>Alex

3.模块模式:通过为单例添加私有变量和特权方法能够使其得到增强。

如果必须创建一个对象并以某些数据对其进行初始化,同时还要公开一些能够访问这些私有数据的方法,那么就可以使用模块模式。

var application=function(){
  //私有变量和函数
  var components=[];
  //初始化
  components.push(new BaseComponent());
  //公共接口
  return {
    getComponentCount:function(){
      return components.length;
    },
    registerComponent:function(){
      if(typeof component=="object"){
        components.push(component);
      }
    }
  }
}();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Javascript模块模式分析

    Douglas Crockford已经传授了一个有用的单例模式(singleton pattern)实现此规则,我认为他的模式有益于你基于YUI的那些应用.Douglas叫它模块模式(module pattern).它是如下工作的: 创建一个命名空间对象:如果你使用YUI,可以用YAHOO.namespace()方法: YAHOO.namespace("myProject");这分配了一个空的myProject对象,是YAHOO的一个成员(如 果myProject已存在的话,则不会被覆

  • JavaScript模块模式实例详解

    本文实例讲述了JavaScript模块模式.分享给大家供大家参考,具体如下: 在JS中没有Class的概念,那么如何体现Object的Public和Private属性呢,答案就是模块模式(Module Pattern). JS中有一个显著的特性: 匿名函数(anonymous function),通过匿名函数的建立和执行,匿名函数里的代码就形成了一个闭包(closure),从而形成,封装和控制一个对象的Private和Public的特性,避免了全局变量的泛滥和与其他脚本的冲突. (functio

  • JavaScript设计模式之单例模式实例

    <Practical Common Lisp>的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型或强类型,静态或动态语言,命令式或说明式语言.每种语言都有天生的优缺点.一个牙买加运动员, 在短跑甚至拳击方面有一些优势,在练瑜伽上就欠缺一些. 术士和暗影牧师很容易成为一个出色的辅助,而一个背着梅肯满地图飞的敌法就会略显尴尬. 换到程序中, 静态语言里可能需要花很多功夫来实现装饰

  • javascript设计模式之模块模式学习笔记

    我们通过单体模式理解了是以对象字面量的方式来创建单体模式的:比如如下的对象字面量的方式代码如下: var singleMode = { name: value, method: function(){ } }; 模块模式的思路是为单体模式添加私有变量和私有方法能够减少全局变量的使用:如下就是一个模块模式的代码结构: var singleMode = (function(){ // 创建私有变量 var privateNum = 112; // 创建私有函数 function privateFun

  • JavaScript设计模式之工厂方法模式介绍

    1. 简单工厂模式 说明:就是创建一个工厂类,里面实现了所对同一个接口的实现类的创建. 但是好像JavaScript 好像没有 接口 这号东西,所以我们去掉接口这个层; 当然,我们这里的 实现类 下的成员变量,方法应该都是一样的: 例如:这时举短信发送跟邮件发送的例子; 1>. 邮件发送[实现]类 复制代码 代码如下: function MailSender() {     this.to = '';     this.title = '';     this.content = ''; } M

  • JavaScript 设计模式之组合模式解析

    怎么说呢?!就像是动物(组合对象)一样,当它生下后代(叶对象)时,它的后代就有了某种功能(比如:挖洞,听力好等等):也像是一棵树,它有一个根(组合对象)然后是从这个棵树向外冒出的其他枝杆(组合对象)以及从这些枝杆又向外长的叶子(叶对象).换句话说,就是当祖先已经有了,那么只要从这个祖先衍生出来的其他孩子(包括这个祖先下的其他组合对象)已经就具备了某种功能,看上去貌似又有些像是继承."组合模式"在组合对象的层次体系中有两种类型的对象:叶对象和组合对象.组合模式擅长于对大批对象进行操作.

  • Javascript的一种模块模式

    Douglas Crockford已经传授了一个有用的单例模式(singleton pattern)实现此规则,我认为他的模式有益于你基于YUI的那些应用.Douglas叫它模块模式(module pattern).它是如下工作的: 创建一个命名空间对象:如果你使用YUI,可以用YAHOO.namespace()方法: YAHOO.namespace("myProject");这分配了一个空的myProject对象,是YAHOO的一个成员(如 果myProject已存在的话,则不会被覆

  • JavaScript 设计模式 安全沙箱模式

    命名空间 JavaScript本身中没有提供命名空间机制,所以为了避免不同函数.对象以及变量名对全局空间的污染,通常的做法是为你的应用程序或者库创建一个唯一的全局对象,然后将所有方法与属性添加到这个对象上. 复制代码 代码如下: /* BEFORE: 5 globals */ // constructors function Parent() {} function Child() {} // a variable var some_var = 1; // some objects var mo

  • javascript 模式设计之工厂模式学习心得

    模式类型:工厂模式 模式说明:常用模式之一,用来动态创建对象 适用范围:在运行期间需要在一系列可互换的子类中进行选择的类 注意事项:接口的实现,从而使不同子类可以被同等的对待,恰当的使用工厂模式,但不要拘泥与形式,理解本质. 关键点:以 函数/类/子类 构建的选择器 本质:函数作为选择器的使用 一般使用形式: 作为独立的选择器存在: 复制代码 代码如下: function FactoryMode(index){ switch(index){ case "index1" : return

  • javascript设计模式之解释器模式详解

    神马是"解释器模式"? 先翻开<GOF>看看Definition:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 在开篇之前还是要科普几个概念: 抽象语法树: 解释器模式并未解释如何创建一个抽象语法树.它不涉及语法分析.抽象语法树可用一个表驱动的语法分析程序来完成,也可用手写的(通常为递归下降法)语法分析程序创建,或直接client提供. 解析器: 指的是把描述客户端调用要求的表达式,经过解析,形成一个抽象语法树的程序. 解

  • 常用的Javascript设计模式小结

    <Practical Common Lisp>的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型或强类型,静态或动态语言,命令式或说明式语言.每种语言都有天生的优缺点.一个牙买加运动员, 在短跑甚至拳击方面有一些优势,在练瑜伽上就欠缺一些. 术士和暗影牧师很容易成为一个出色的辅助,而一个背着梅肯满地图飞的敌法就会略显尴尬. 换到程序中, 静态语言里可能需要花很多功夫来实现装饰

  • JavaScript设计模式之观察者模式(发布者-订阅者模式)

    观察者模式( 又叫发布者-订阅者模式 )应该是最常用的模式之一. 在很多语言里都得到大量应用. 包括我们平时接触的dom事件. 也是js和dom之间实现的一种观察者模式. 复制代码 代码如下: div.onclick  =  function click (){ alert ( "click' ) } 只要订阅了div的click事件. 当点击div的时候, function click就会被触发. 那么到底什么是观察者模式呢. 先看看生活中的观察者模式. 好莱坞有句名言. "不要给我

随机推荐