私有作用域:跟外界的变量方法毫不冲突,豪无关系

var str ="javascript";
(function(){
alert(str); //undefined
var str = "hello world";
alert(str);//hello world
})();
alert(str);//javascript

语法解析:函数自执行里面可以当做块级作用域

(function(){
//块级作用域
})();

私有变量:

function Person(name){
this.setName = function(value){
name = value;
}
this.getName = function(){
return name;
}
}
var people = new Person('a');
alert(people.getName());//a
people.setName('小明');
alert(people.getName());//小明
alert(people.name);//undefined

  这个例子就很好的阐明了私有变量的好处,以及常用的方式。目的是让私有的变量不能被外部访问到,只能有特定的方法调用

  如此一来我们有发现问题了,这里的参数name都是每一个实例单独拥有的,我如果想得到一个所有实例共享的私有变量呢?如果你有java或者其他面向对象语言的基础的话,你会发现我们要的其实就是静态私有变量,没有这些基础也没关系,你了解他的用途也是一样的,我们看下面的一段代码:

静态私有变量:所有实例共享的私有变量

(function(){
var name = "";
Person = function(value){
name = value;
};
Person.prototype.setName = function(value){
name = value;
};
Person.prototype.getName = function(){
return name;
};
})();
var people1 = new Person("a");
console.log(people1.getName());//a
people1.setName("b");
console.log(people1.getName());//b
var people2 = new Person("小明");
console.log(people1.getName(),people2.getName());//小明 小明

  通过打印出来的值发现他们是共用同一个变量name。而由于是私有作用域我们只能通过实例化的对象调用特定的方法getName才能得到name的值。

模块模式:
  前面的私有变量属于模块模式,但是还有一种模式,那就是为单例创建的私有变量和特权方法。所谓的单例,就是说只有一个实例对象,共享相同的属性,我们前面的静态私有变量是多个实例对象共享相同的属性。
  先给一个简单的例子体会一下单例:
var person = {
name:"小明",
method:function(){
//具体方法
}
};

  就是指大家都用的是同一个对象person。继续看看我们说的单例私有变量:

var person = function(){
var privateName = '小明';
function callName(){
alert(privateName);
}
return {
publicShowName : function(){
callName();
}
}
}();
person.publicShowName();//小明
  这个就是能够用一个对象共享相同的方法,同时私有变量name不包含在公众视野之下,只能通过特定方法publicShowName()访问。至于为什么要使用自执行函数var fun = function(){}(); 其实跟我们上面私有变量一样,需要通过私有作用域隐藏私有变量,而且不需要实例化
  下面我们来写一个函数注册组件的例子吧:
function baseComponent(){
}
function otherComponent(){
}
//定义两个组件
var app = function(){
var components = new Array();
components.push(new baseComponent());
return {
getComponentCount:function(){
return components.length;
},
registerComponent:function(component){
if(typeof component == 'object'){
components.push(component);
}
}
};
}();
alert(app.constructor);//function Object(){}
alert(app.getComponentCount());//1
app.registerComponent(new otherComponent());
alert(app.getComponentCount());//2

  这是一个注册组件的例子,他只提供了注册和访问有多少个组件的方法。这里我们最后返回的对象都是Object,我们可能需要更加面向对象一些,我们可能需要返回的是特有的对象,同样是上面的例子,我们可以这样做

function Component(){
}
function baseComponent(){
}
function otherComponent(){
}
//定义两个组件
var application = function(){
var components = new Array();
components.push(new baseComponent());
var app = new Component();
app.getComponentCount = function(){
return components.length;
};
app.registerComponent = function(component){
if(typeof component == 'object'){
components.push(component);
}
}
return app;
}(); alert(application.constructor);//function Component() {}
alert(application.getComponentCount());//1
application.registerComponent(new otherComponent());
alert(application.getComponentCount());//2

理解JavaScript私有作用域的更多相关文章

  1. 深入理解Javascript变量作用域

    在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数 ...

  2. 理解JavaScript的作用域链

    上一篇文章中介绍了Execution Context中的三个重要部分:VO/AO,scope chain和this,并详细的介绍了VO/AO在JavaScript代码执行中的表现. 本文就看看Exec ...

  3. 理解JavaScript中作用域链的关系

    javascript里的关系又多又乱.作用域链是一种单向的链式关系,还算简单清晰:this机制的调用关系,稍微有些复杂:而关于原型,则是prototype.proto和constructor的三角关系 ...

  4. 彻底理解JavaScript原型

    原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有"[[prototype]]"属性,函数对象有"prototype"属性,原型对 ...

  5. Javascript的作用域和闭包(一)

    一.作用域是什么? 几乎所有的编程语言最基本的功能之一,就是能够存储变量的值,并且能访问和修改这些值. 修改变量值的过程我们通常在程序执行时,称为改变一个对象的状态.有了状态,让程序变得有非常有趣. ...

  6. 理解JavaScript中的作用域和上下文

    JavaScript对于作用域(Scope)和上下文(Context)的实现是这门语言的一个非常独到的地方,部分归功于其独特的灵活性. 函数可以接收不同的的上下文和作用域.这些概念为JavaScrip ...

  7. 理解 JavaScript 作用域(转)

    简介 JavaScript 有个特性称为作用域.尽管对于很多开发新手来说,作用域的概念不容易理解,我会尽可能地从最简单的角度向你解释它们.理解作用域能让你编写更优雅.错误更少的代码,并能帮助你实现强大 ...

  8. 深入理解JavaScript中的作用域和上下文

    介绍 JavaScript中有一个被称为作用域(Scope)的特性.虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,我会尽我所能用最简单的方式来解释作用域.理解作用域将使你的代码脱颖而出,减 ...

  9. JavaScript的作用域和块级作用域概念理解

    作用域 作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期.说到这里我们需要理解两个概念:块级作用域与函数作用域. 函数作用域 这个应该好理解,函数作用域就是说定义在 ...

随机推荐

  1. PreEssentials与MFC集成使用

    ProEssentials是Gigasoft公司开发的一个功能十分强大的分发免费的工控图表.它提供了几乎所有的曲线显示形式,支持多种开发工具,提供以下接口供开发者调用:.NET(WinForm).AS ...

  2. 线性表之单链表C++实现

    线性表之单链表 一.头文件:LinkedList.h //单链表是用一组任意的存储单元存放线性表的元素,这组单元可以是连续的也可以是不连续的,甚至可以是零散分布在内存中的任意位置. //单链表头文件 ...

  3. codevs 1365 浴火银河星际跳跃

    1365 浴火银河星际跳跃 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小 K 又在玩浴火银河了...不过这次他的目的不是跑运输 ...

  4. hihocoder 1509 异或排序

    题面在这里! 考虑前后两个数 x,y,可以发现S只有在(x xor y)的最高有1位上的取值是要被确定的 (如果x==y那么没有限制),可以推一下什么情况下是1/0. 于是我们模拟一下这个操作,判一判 ...

  5. JavaMail_测试编写

    @Test public void test1() throws Exception{ // import java.util.Properties; // import javax.mail.Add ...

  6. Git_使用GitHub

    我们一直用GitHub作为免费的远程仓库,如果是个人的开源项目,放到GitHub上是完全没有问题的.其实GitHub还是一个开源协作社区,通过GitHub,既可以让别人参与你的开源项目,也可以参与别人 ...

  7. SyncTrayzor -- Windows tray utility / filesystem watcher / launcher for syncthing

    SyncTrayzor is a little tray utility for Syncthing on Windows. It hosts and wraps Syncthing, making ...

  8. Win7 开启显示快速启动工具栏,发送到快速启动右键菜单

    开启Win7快速启动栏 许多网友一定记得在 Windows 7 之前的 Windows 系统都有个快速启动(quick launch)区域. 比如 IE 浏览器.Windows Media Playe ...

  9. QT 安装 4.8.7 on solaris 10

    1.  下载 QT 4.8.7: http://download.qt.io/official_releases/qt/4.8/4.8.7/qt-everywhere-opensource-src-4 ...

  10. C# 获得当前 进程 或 线程的ID

    如果获得当前进程的Id用: Process[] processes = Process.GetProcesses(); foreach(Process process in processes) {  ...