规避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

最有效的方法,还是采用面向对象开发吧,面向对象非常适合团队化开发,这样可以最大化的减少代码耦合的几率,项目也容易维护。

原文地址:https://www.cnblogs.com/luoge-Snippet/p/9271320.html

时间: 2024-11-09 22:49:03

规避Javascript多人开发函数和变量重名问题的相关文章

如何规避javascript多人开发函数重名问题

命名空间 封闭空间 js模块化mvc(数据层.表现层.控制层) seajs(如果了解的呢,可以说) 变量转换成对象的属性 对象化

JavaSE8基础 当父类与子类中的成员变量重名了,使用super.名字 来访问父类的成员变量

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        代码: /* * 当父类与子类中的成员变量重名了,使用super.名字 来访问父类的成员变量 */ //基类 class Person { public int num = 1; } //子类 class Javaer extends Person { //子类中的成员变量与父类重名了 public int num

静态的成员变量重名的解决方案

public class Demo07_StaticField { static String name = "Jack"; public static void main(String[] args) { String name = "Alex"; System.err.println(name);//Alex System.err.println(Demo07_StaticField.name);//对于静态的变量,可以使用类名.形式直接访问成员 - Jack

JavaScript调用AngularJS的函数/$scope/变量

使用背景: 需要在其他JavaScript文件中调用AngularJS内部方法或改变$scope变量,同时还要保持双向数据绑定: 首先获取AngularJS application: 方法一:通过controller来获取app var appElement = document.querySelector('[ng-controller=mainController]'); 然后在获取$scope变量: var $scope = angular.element(appElement).scop

c语言全局变量与局部变量(当变量重名时)的使用情况

在c语言中,变量有全局变量和局部变量之分,这一点和很多高级语言类似,如c#,java等.不过与c#,java中的局部变量如在全局变量作用域内则不允许与全局变量名相同,而c语言是允许这样做的.这样的做法极不提倡,但是c语言既然允许这么做,就分析一下其变量名相同时在不同位置调用该变量名时所实际调用的是哪个变量值. 代码如下: #include <stdio.h> //全局变量 //作用域:从定义开始到文件结束 //默认初始值为0 int c = 1; int test() { int c = 2;

shell脚本变量定义注意别跟系统变量重名了……

写了个很简单的脚本,执行结果却很奇怪.   1 #!/bin/bash 2 3 PATH=$HOME/vlc_transplant4 4 5 rm -f $PATH/vlc 6 ln -s $PATH/bin/vlc-static $PATH/vlc 执行结果: [email protected]:~/vlc_transplant4$ ./update.sh ./update.sh: 行 5: rm: 未找到命令 ./update.sh: 行 6: ln: 未找到命令 原因是自己在脚本中定义的P

如何区分3种变量重名的问题

原文地址:https://www.cnblogs.com/wulinmiao/p/12104120.html

JavaScript 笔记(2) -- 类型转换 &amp; 正则表达 &amp; 变量提升 &amp; 表单验证

目录:  typeof, null, undefined, valueOf() 类型转换 正则表达式 错误: try, catch, throw 调试工具 变量提升 strict 严格模式 使用误区 表单 & 表单验证 JavaScript void typeof, null, undefined, valueOf() typeof:用于检测变量的数据类型,eg: typeof "John"; // 返回 string 在 JavaScript 中有 5 种不同的数据类型:st

[Effective JavaScript 笔记]第2章:变量作用域--个人总结

前言 第二章主要讲解各种变量作用域,通过这章的学习,接触到了很多之前没有接触过的东西,比如不经常用到的eval,命名函数表达式,with语句块等,下面是一个列表,我对各节的一点点个人总结,很多都是自己的收获和认识.可能有很多认识的误区,毕竟水平有限.如果有那里认识不对的地方,还希望可以在评论中指出来,这样可以得到大家在学习的帮助,也是很不错的. 第8条:尽量少用全局对象 个人总结: 解释全局对象在JS中定义的随意性,导致所有人都可以去定义去修改,导致命名冲突.对这样的全局对象进行依赖,导致不可知