理解JavaScript私有作用域
私有作用域:跟外界的变量方法毫不冲突,豪无关系
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私有作用域的更多相关文章
- 深入理解Javascript变量作用域
在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数 ...
- 理解JavaScript的作用域链
上一篇文章中介绍了Execution Context中的三个重要部分:VO/AO,scope chain和this,并详细的介绍了VO/AO在JavaScript代码执行中的表现. 本文就看看Exec ...
- 理解JavaScript中作用域链的关系
javascript里的关系又多又乱.作用域链是一种单向的链式关系,还算简单清晰:this机制的调用关系,稍微有些复杂:而关于原型,则是prototype.proto和constructor的三角关系 ...
- 彻底理解JavaScript原型
原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有"[[prototype]]"属性,函数对象有"prototype"属性,原型对 ...
- Javascript的作用域和闭包(一)
一.作用域是什么? 几乎所有的编程语言最基本的功能之一,就是能够存储变量的值,并且能访问和修改这些值. 修改变量值的过程我们通常在程序执行时,称为改变一个对象的状态.有了状态,让程序变得有非常有趣. ...
- 理解JavaScript中的作用域和上下文
JavaScript对于作用域(Scope)和上下文(Context)的实现是这门语言的一个非常独到的地方,部分归功于其独特的灵活性. 函数可以接收不同的的上下文和作用域.这些概念为JavaScrip ...
- 理解 JavaScript 作用域(转)
简介 JavaScript 有个特性称为作用域.尽管对于很多开发新手来说,作用域的概念不容易理解,我会尽可能地从最简单的角度向你解释它们.理解作用域能让你编写更优雅.错误更少的代码,并能帮助你实现强大 ...
- 深入理解JavaScript中的作用域和上下文
介绍 JavaScript中有一个被称为作用域(Scope)的特性.虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,我会尽我所能用最简单的方式来解释作用域.理解作用域将使你的代码脱颖而出,减 ...
- JavaScript的作用域和块级作用域概念理解
作用域 作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期.说到这里我们需要理解两个概念:块级作用域与函数作用域. 函数作用域 这个应该好理解,函数作用域就是说定义在 ...
随机推荐
- key Value
key 存值的编号 value 存放的数据 看来key 和value 可以为null~ public class Dog { private int id; private String name ...
- 【SQL】177. Nth Highest Salary
Write a SQL query to get the nth highest salary from the Employee table. +----+--------+ | Id | Sala ...
- matlab绘制心形函数
matlab 7.0 绘制二维.三维心形函数 又到周六,下周就要迎来春节小长假了,想想都有些激动.在外漂了一整年,总于可以回家和父母团聚了,还有吃好吃的...,哎呀~想想都流口水呢.不过先 ...
- POJ 3678 Katu Puzzle 2-SAT 强连通分量 tarjan
http://poj.org/problem?id=3678 给m条连接两个点的边,每条边有一个权值0或1,有一个运算方式and.or或xor,要求和这条边相连的两个点经过边上的运算后的结果是边的权值 ...
- 转 TCP/IP的三次握手与四次挥手详解
TCP((Transmission Control Protocol)传输控制协议,是一个面向连接的协议.在运用此协议进行数据传输前都会进行连接的建立工作(三次握手):当数据传输完毕,连接的双方都会通 ...
- hdu 4452 Running Rabbits 模拟
Running RabbitsTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- Codeforces Round #280 (Div. 2) A. Vanya and Cubes 水题
A. Vanya and Cubes time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Oracle VM VisualBox 虚拟机创建共享文件夹。
先来啰嗦几句,公司的电脑用的是 VMware10的虚拟机 相信大家都很熟悉了 VMware 创建共享文件功能可以直接安装tools来实现 但是 Oracle VM VisualBox 第一次玩 ...
- 获取不到offsetHeight问题
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- oracle监听理解 命名理解
一.监听器是oracle基于服务器端的一种网络服务,主要作用是监听客户端的连接请求,并将请求转发给服务器. 监听器基于端口的,每个监听器会占用一个端口.默认监听端口1521. oracle家目录下的n ...