深入理解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 相关文章推荐
SyntaxHighlighter语法高亮插件使用说明
Aug 14 Javascript
JS嵌套函数调用上下文的问题解决
Mar 26 Javascript
同一个网页中实现多个JavaScript特效的方法
Feb 02 Javascript
简述JavaScript对传统文档对象模型的支持
Jun 16 Javascript
原生JS实现美图瀑布流布局赏析
Sep 07 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
Jun 16 Javascript
利用Query+bootstrap和js两种方式实现日期选择器
Jan 10 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
Dec 11 jQuery
angular 实现的输入框数字千分位及保留几位小数点功能示例
Jun 19 Javascript
js中!和!!的区别与用法
May 09 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
Jun 01 Javascript
关于Vue中的options选项
Mar 22 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相关资料
2006/10/09 PHP
解析php通过cookies获取远程网页的指定代码
2013/06/25 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
降低PHP Redis内存占用
2017/03/23 PHP
greybox——不开新窗口看新的网页
2007/02/20 Javascript
javascript add event remove event
2008/04/07 Javascript
关于document.cookie的使用javascript
2008/04/11 Javascript
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
利用javascript的面向对象的特性实现限制试用期
2011/08/04 Javascript
getJSON调用后台json数据时函数被调用两次的原因猜想
2013/09/29 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
jQuery Real Person验证码插件防止表单自动提交
2015/11/06 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
javascript 判断当前浏览器版本并判断ie版本
2017/02/17 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
2018/05/31 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
粗略分析Python中的内存泄漏
2015/04/23 Python
Python松散正则表达式用法分析
2016/04/29 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
python中round函数保留两位小数的方法
2020/12/04 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
加拿大品牌鞋包连锁店:Little Burgundy
2021/02/28 全球购物
开发中都用到了那些设计模式?用在什么场合?
2014/08/21 面试题
初中生物教学反思
2014/01/10 职场文书
工程造价专业大学生职业规划范文
2014/03/09 职场文书
初三学生个人自我评定
2014/04/06 职场文书
党员群众路线教育实践活动剖析材料
2014/10/10 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
CocosCreator如何实现划过的位置显示纹理
2021/04/14 Javascript