规避Javascript多人开发函数和变量重名问题
函数和变量重名始终是一个令人头痛的问题,先讲变量吧,相信了解JS的朋友都知道,在JS中
是没有块级作用域的只有函数作用域,也就是说那些以大括号为界定符的代码块是管不住其中定义
的变量的作用域的,举例:
1 {
2 var num = 110;
3 }
4 console.log(num);//打印结果:110,而不是num is not defined
1 for(var j = 0; j < 5; j++);
2 console.log(j);//结果:5
怎么解决? 一般来说有经验的程序员会尽量少的使用全局变量,尽可能使用局部变量,这不仅会减少变量重名的几率,
更会减少内存开销,因为局部变量一般都会在函数结束后自动销毁释放出内存,而全局变量会直到进程结束才会被销毁
掉。其次,当我们需要一个作用域来关住变量时一般会用一个匿名函数来充当这个作用域。如:
1 (function(){
2 var gender = '男';
3 })();
4 console.log(gender);//结果是:gender is not defined
匿名函数充当作用域这种方法一般已经能够满足一部分程序员的需求了,但问题来了,函数重名怎么解决?
项目中必须要使用大量全局变量又该如何解决呢?
其实解决办法跟上面方法的思路一样,只是有一点技巧性,JS既然缺少作用域限制,那我们自己再给它人为加上一个
作用域,并且保证每个作用域不重复,这样一来问题不就解决了吗。好了接下来我们缺少的就是这么一个神奇的作用域
替代品,令人开心的是,这个东西本身JS就有,那就是对象!
具体我们可以这么操作:假如现在有三个同学要一起合作一个教务系统的项目,这个系统需要老师和学生还有工作人员
的信息,三个同学分工解决这三类信息的工作,具体代码如下:
1 // A同学负责的工作人员信息
2 var A = {} //定义一个空对象
3 A.name = 'tom';
4 A.gender = 'male';
5 A.age = 30;
6 A.showName = function() {
7 alert(this.name);
8 }
9 A.showAge = function() {
10 alert(this.age);
11 }
12
13 // B同学负责的老师信息
14 var B = {}
15 B.name = 'Jack';
16 B.gender = 'male';
17 B.age = 28;
18 B.showName = function() {
19 alert(this.name);
20 }
21 B.showAge = function() {
22 alert(this.age);
23 }
24
25 // C同学负责的学生信息
26 var C = {}
27 C.name = 'Lucy';
28 C.gender = 'female';
29 C.age = 17;
30 C.showName = function() {
31 alert(this.name);
32 }
33 C.showAge = function() {
34 alert(this.age);
35 }
可以看到,ABC同学负责的模块中都出现了同名的区域,name,age,showName,showAge等,此时却并不会
出现冲突的问题,因为这些变量和方法都挂载到了不同的对象上,这无形中就给每个同名变量和方法增加了一个
顶部命名空间,这样一来困扰我们的问题就可以很轻易的解决了。
1 // 正常使用,不会冲突
2 console.log(A.name);//结果:tom
3 console.log(B.name);//结果:Jack
4 console.log(C.name);//结果:Lucy
5 A.showAge();//结果:30
6 B.showAge();//结果:28
7 C.showAge();//结果:17
最有效的方法,还是采用面向对象开发吧,面向对象非常适合团队化开发,这样可以最大化的减少代码耦合的几率,项目也容易维护。
规避Javascript多人开发函数和变量重名问题的更多相关文章
- 规避javascript多人开发函数重名问题
命名空间 封闭空间 js模块化mvc(数据层.表现层.控制层) seajs 变量转换成对象的属性 对象化
- 如何规避javascript多人开发函数重名问题
命名空间 封闭空间 js模块化mvc(数据层.表现层.控制层) seajs(如果了解的呢,可以说) 变量转换成对象的属性 对象化
- javascript函数中变量重名
<script type="text/javascript"> function fun(a){ console.log(a); // function var a=1 ...
- linker command failed with exit code 1 (use -v to see invocation) 变量重名
有时候,xcode报错看不到,点最后一个按钮,类似气泡的就能看到 报错信息: duplicate symbol _imgNummmm in: /Users/mianmian/Library/De ...
- delphi with... do和自定义变量重名
with类中的变量和外部变量如果重名,会将外部变量覆盖,这点需要注意!!!!!
- ZH奶酪:JavaScript调用AngularJS的函数/$scope/变量
使用背景: 需要在其他JavaScript文件中调用AngularJS内部方法或改变$scope变量,同时还要保持双向数据绑定: 首先获取AngularJS application: 方法一:通过co ...
- Python使用property函数定义的属性名与其他实例变量重名会怎么样?
首先如果定义的属性名与该属性对应的操作方法操作的实例对象同名就会触发无穷的递归调用,相关部分请参考<Python案例详解:使用property函数定义与实例变量同名的属性会怎样?> 但如果 ...
- c语言全局变量与局部变量(当变量重名时)的使用情况
在c语言中,变量有全局变量和局部变量之分,这一点和很多高级语言类似,如c#,java等.不过与c#,java中的局部变量如在全局变量作用域内则不允许与全局变量名相同,而c语言是允许这样做的.这样的做法 ...
- shell脚本变量定义注意别跟系统变量重名了……
写了个很简单的脚本,执行结果却很奇怪. 1 #!/bin/bash PATH=$HOME/vlc_transplant4 rm -f $PATH/vlc ln -s $PATH/bin/vlc-s ...
随机推荐
- POJ 3225 线段树区间更新(两种更新方式)
http://blog.csdn.net/niuox/article/details/9664487 这道题明显是线段树,根据题意可以知道: (用0和1表示是否包含区间,-1表示该区间内既有包含又有不 ...
- centos解决The path "" is not a valid path to the 3.2.0-4-amd64 kernel headers.问题
我的机子炸了,然后我就得重新装我的虚拟机,再然后我就想去弄好我的共享文件夹安装vmtools,安装的时候出现了一个问题,我忘记以前是怎么解决的,又困扰了我好久 Searching for a vali ...
- foreach的基本语法
有一个布尔型循环是专门用来循环数组的.这个循环的基本语法就是foreach基本语法 foreach( 要循环的数组变量 as [键变量 =>] 值变量){ //循环的内容 } 这是一个固定用法, ...
- 洛谷P1970 花匠(dp)
题意 题目链接 Sol 直接用\(f[i][0/1]\)表示到第\(i\)个位置,该位置是以上升结尾还是以下降结尾 转移的时候只需枚举前一个即可 #include<cstdio> #inc ...
- sass函数:@function
sass定义了很多函数可供使用,当然你也可以自己定义函数,以@fuction开始. sass的官方函数链接为:sass fuction,实际项目中我们使用最多的应该是颜色函数,而颜色函数中又以ligh ...
- linux里终端安转视频播放器的操作及显示
[enilu@enilu ~]$ mplayerbash: mplayer: command not found[enilu@enilu ~]$ yum list | grep mplayer^C^C ...
- Ubuntu(Debian)apt-get
Ubuntu(Debian)的aptitude与apt-get的区别和联系 最近在使用Puppet快速部署Openstack,看到一些没见过的工具,例如aptitude,在Ubuntu上有强大的a ...
- ContentProvider启动浅析
一.自己的理解 对于content provide的启动我是这样认为的,要用ContentResolver去获得一个contentProvider,在这的获得的过程中, 1.如果本应用之前有conte ...
- 功能强大的系统配置工具-- Siebel Tools
Siebel Tools 是Siebel 为其CRM产品开发人员专门提供的系统配置工具,系统的客户化修改以及系统升级控制等都是通过该工具进行配置(Configuration) .该工具直接修改Sieb ...
- SQL Server ->> CLR存储过程枚举目录文件并返回结果集
因工作需要写了个CLR存储过程枚举目录文件并返回结果集 using System; using System.IO; using System.Collections.Generic; using S ...