深入理解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 相关文章推荐
原型方法的不同写法居然会影响调试的解决方法
Mar 08 Javascript
js 函数调用模式小结
Dec 26 Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
Jul 09 Javascript
AngularJS入门教程(零):引导程序
Dec 06 Javascript
基于jquery实现省市联动效果
Nov 23 Javascript
node.js平台下的mysql数据库配置及连接
Mar 31 Javascript
jQuery实现点击关注和取消功能
Jul 03 jQuery
Bootstrap table使用方法汇总
Nov 17 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
Mar 27 Javascript
JS实现获取数组中最大值或最小值功能示例
Mar 02 Javascript
快速解决element的autofocus失效问题
Sep 08 Javascript
Element实现动态表格的示例代码
Aug 02 Javascript
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部分常见问题总结
2008/03/27 PHP
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
destoon实现调用图文新闻的方法
2014/08/21 PHP
PHP类的反射用法实例
2014/11/03 PHP
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
从零开始学习jQuery (八) 插播:jQuery实施方案
2011/02/23 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
JavaScript中调用函数的4种方式代码实例
2015/07/08 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
ligerUI---ListBox(列表框可移动的实例)
2017/11/28 Javascript
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
Vue如何跨组件传递Slot的实现
2020/12/14 Vue.js
[15:09]DOTA2国际邀请赛采访专栏:Loda
2013/08/06 DOTA
python中使用sys模板和logging模块获取行号和函数名的方法
2014/04/15 Python
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
Windows下python2.7.8安装图文教程
2016/05/26 Python
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
python利用正则表达式排除集合中字符的功能示例
2017/10/10 Python
Pandas DataFrame 取一行数据会得到Series的方法
2018/11/10 Python
python3编写ThinkPHP命令执行Getshell的方法
2019/02/26 Python
python程序变成软件的实操方法
2019/06/24 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
新西兰购物网站:TheMarket NZ
2020/09/19 全球购物
广州一家公司的.NET面试题
2016/06/11 面试题
《都江堰》教学反思
2014/02/07 职场文书
论文指导教师评语
2014/04/28 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
员工自我评价范文
2015/03/11 职场文书
投诉书范文
2015/07/02 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书
浅谈Laravel中使用Slack进行异常通知
2021/05/29 PHP
MySQL为id选择合适的数据类型
2021/06/07 MySQL
2022微信温控新功能上线
2022/05/09 数码科技