js中避免函数名和变量名跟别人冲突(1)

时间:2021-07-10 00:45:12

方法1:

(function(){
var m = 0;
var n = 1;

function getName(){
return m;
}

function setName(name){
m=name;
}


Window['mySpace']=getName();


})();

mySpace();
//jquery就是这么干的

方法2:

var mainSpace = window.nameSpace ||{};
mainSpace.name = 'main';
mainSpace.type='page';
mainSpace.sayHello = function(name){
return 'hello'+(name||this.name);
};

mainSpace.sayHello();

方法3:

//定义类
var mainSpace = window.mainSpace || {};

mainSpace.Person = function(){
this.name = 'John';
}

mainSpace.Person.prototype.getName = function(_name){
return 'Hello '+(_name || this.name);
};

//调用
var p1= new mainSpace.Person();
p1.getName();

其它:
通过JSON对象创建Object

/*
Object
*/

var NameSpace = window.NameSpace || {};
NameSpace.Hello = {
name: 'world'
, sayHello: function(_name) {
return 'Hello ' + (_name || this.name);
}
};

调用

NameSpace.Hello.sayHello('JS');
> Hello JS;

这种写法比较紧凑,缺点是所有变量都必须声明为公有(public)的,导致所有对这些变量的引用都需要加this指示作用域,写法也略有冗余。

通过闭包(Closure)和Object实现

在闭包中声明好所有变量和方法,并通过一个JSON Object返回公有接口:

var NameSpace = window.NameSpace || {};
NameSpace.Hello = (function() {
//待返回的公有对象
var self = {};
//私有变量或方法
var name = 'world';
//公有方法或变量
self.sayHello = function(_name) {
return 'Hello ' + (_name || name);
};
//返回的公有对象
return self;
}());

Object和闭包的改进型写法

上个例子在内部对公有方法的调用也需要添加self,如:self.sayHello(); 这里可以最后再返回所有公有接口(方法/变量)的JSON对象。

var NameSpace = window.NameSpace || {};
NameSpace.Hello = (function() {
var name = 'world';
var sayHello = function(_name) {
return 'Hello ' + (_name || name);
};
return {
sayHello: sayHello
};
}());

Function的简洁写法

这是一种比较简洁的实现,结构紧凑,通过function实例,且调用时无需实例化(new),方案来自*:

var NameSpace = window.NameSpace || {};
NameSpace.Hello = new function() {
var self = this;
var name = 'world';
self.sayHello = function(_name) {
return 'Hello ' + (_name || name);
};
};

调用

NameSpace.Hello.sayHello();