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


Posted in Javascript onOctober 31, 2016

本文详细的介绍了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); 
      } 
    } 
  } 
}();

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

Javascript 相关文章推荐
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
Mar 23 Javascript
Jquery下:nth-child(an+b)的使用注意
May 28 Javascript
jquery 触发a链接点击事件解决方案
May 02 Javascript
一个获取第n个元素节点的js函数
Sep 02 Javascript
JavaScript中实现最高效的数组乱序方法
Oct 11 Javascript
JavaScript中的alert()函数使用技巧详解
Dec 29 Javascript
jQuery使用animate创建动画用法实例
Aug 07 Javascript
Node.js中你不可不精的Stream(流)
Jun 08 Javascript
webpack4 CSS Tree Shaking的使用
Sep 03 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
Apr 19 Javascript
使用Vue-scroller页面input框不能触发滑动的问题及解决方法
Aug 08 Javascript
Vue3 Composition API的使用简介
Mar 29 Vue.js
jQuery grep()方法详解及实例代码
Oct 30 #Javascript
webix+springmvc session超时跳转登录页面
Oct 30 #Javascript
js获取时间函数及扩展函数的方法
Oct 30 #Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
Oct 30 #Javascript
浅谈JS函数定义方式的区别
Oct 30 #Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
Oct 30 #Javascript
原生js代码实现图片放大境效果
Oct 30 #Javascript
You might like
php之字符串变相相减的代码
2007/03/19 PHP
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
2013/06/29 PHP
php mysql 封装类实例代码
2016/09/18 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
jquery load事件(callback/data)使用方法及注意事项
2013/02/06 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
2017/01/01 Javascript
js Date()日期函数浏览器兼容问题解决方法
2017/09/12 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
2018/02/12 jQuery
详解基于Vue-cli搭建的项目如何和后台交互
2018/06/29 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
JavaScript中的几种继承方法示例
2020/12/06 Javascript
python数据结构之二叉树的遍历实例
2014/04/29 Python
Python爬虫设置代理IP(图文)
2018/12/23 Python
python http基本验证方法
2018/12/26 Python
Python通用函数实现数组计算的方法
2019/06/13 Python
Python Pandas 箱线图的实现
2019/07/23 Python
Django认证系统实现的web页面实现代码
2019/08/12 Python
python实现的发邮件功能示例
2019/09/11 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
如何基于windows实现python定时爬虫
2020/05/01 Python
Python环境管理virtualenv&amp;virtualenvwrapper的配置详解
2020/07/01 Python
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
MySQL面试题目集锦
2016/04/14 面试题
工程管理专业个人求职信范文
2013/12/07 职场文书
教育专业自荐书范文
2013/12/17 职场文书
生产车间主管岗位职责
2013/12/28 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
2015年保送生自荐信
2015/03/24 职场文书
党员转正意见怎么写
2015/06/03 职场文书
Promise静态四兄弟实现示例详解
2022/07/07 Javascript