解决污染的几种方式

函数


对象

//我们以后可以定义不同的对象,来保存全局变量

/*就是将全局变量升级为对象的属性*/

varmodule1 =function(){

this.name=1

this.add=function(){}

}

module1.prototype={}

varmodule2 =function(){

this.name=2

this.add=function(){}

}

module2.prototype={}

varm1 =newmodule1()

varm2 =newmodule2()

m1.name=11111111111

console.log(m1.name)

console.log(m2.name)


闭包




立即函数

匿名函数立即函数

这个函数包含了两部分:函数定义+函数调用

1.1.1改造传统函数成立即函数

/*  function fn(){

console.log('test')

}

fn()*/

/*立即函数不用写调用了,本身就包含了函数定义和调用*/

(function(){

console.log('test')

})();

1.1.2语法规范

(function(){

})()

要求练习10遍

1.1.3立即函数为什么能够解决污染问题

/*团队成员1 --tab组件*/

(function(){

varname='我的同位是好人';

functionfn(){

console.log(name)

}

fn()

})();

/*团队成员2 --使用tab*/

(function(){

varname='我的同位的同位也是好人';

functionfn(){

console.log(name)

}

fn()

})();

规定:立即函数后面必须要加一个分号

1.1.4立即函数传参

(function(x,y){

alert(x+y)

})(2,3)

1.1.5立即函数可以有返回值,可以赋给另一个变量

varrainman =(function(x,y){

returnx+y;

})(2,3);

1.1.6理解函数的特殊写法

/*其实立即函数就是把它当做一个表达式*/

void function() {

}();

~function() {

}();

/* !a*/

varsum =1+function() {

return 1

}();

console.log(sum)

;(function() {

})();

-function(){

alert('water');

}();

1,function(){

console.log(this)// window

}();

1^function(){

console.log(this)// window

}();

1>function(){

console.log(this)// window

}();

~+-!(function(){

alert("run!")

})();

~!(function(){

alert("run!")

})();

(function(){

alert("run!")

}).call();

(function(){

alert("run!")

}).apply()


立即函数+闭包

+-!(function(){

var  name=1;

var  add=function(){

}

})();

(function(){

var  name2=name;

})()

如何解决问题(重点)

第一种将我们需要获取的值赋值给window全局变量,使其成为window的一个属性(缺点:就是暴露很多全局变量)

//定义一个含有闭包特性的匿名函数

(function(){

var   name='SK';

var   sex='男';

function   get1(){

return   name+':'+sex;

}

function   get2(){

return   name+':'+sex;

}

//外界无法访问闭包中的函数,方法

//通过如下方式访问相当于给全局对象扩充一个属性

window.get2= get2;

})();

//    alert(get1());

//get2成为全局变量

alert(get2());

这种存在的问题:如果别人需要访问里面的多个函数或者变量那么我们需要给window定义多个全局变量


第二种将我们需要获取的值赋值给任意一个全部变量,使其成为这个全局变量的属性

//定义一个含有闭包特性的匿名函数

(function(){

varname='SK';

varsex='男';

functionget1(){

returnname+':'+sex;

}

functionget2(){

returnname+':'+sex;

}

varitcast={

name:name,

sex:sex,

get1:get1,

get2:get2,

on:function(){

console.log('事件框架- on')

},

html:function(){}

}

//外界无法访问闭包中的函数,方法

//通过如下方式访问相当于给全局对象扩充一个属性

window.$$=itcast;

})();

//    alert(get1());

//get2成为全局变量

$$.on()


也可以这样子

/ /   window是默认系统全局面向,其实任何全局变量都可以,任何全局变量都可以

varo =newObject();

//定义一个含有闭包特性的匿名函数

(function(w,obj){

varname='书奎';

varsex='男';

functionget1(){

returnname+':'+sex;

}

functionget2(){

returnname+':'+sex;

}

//外界无法访问闭包中的函数,方法

//通过如下方式访问相当于给全局对象扩充一个属性

o.get= get1;

})();

alert(o.get());

/*o省略*/

传参(以后这样子写框架是常用的写法,重点掌握,这种传参传入window是为了提高性能)

//定义一个含有闭包特性的匿名函数

(function(w){

varname='SK';

varsex='男';

functionget1(){

returnname+':'+sex;

}

functionget2(){

returnname+':'+sex;

}

varitcast={

name:name,

sex:sex,

get1:get1,

get2:get2,

on:function(){

console.log('事件框架- on')

},

html:function(){}

}

//外界无法访问闭包中的函数,方法

//通过如下方式访问相当于给全局对象扩充一个属性

w.$$=itcast;

})(window);


第三种:return

/定义一个含有闭包特性的匿名函数

var  my =(function(w){

var  name='田佩瑶';

var  sex='男';

return{

get:function(){

return  name+':'+sex;

}

}

})(window);

//    alert(get1());

//get2成为全局变量

alert(my.get());

/*函数事件*/

/* 1必须将立即函数返回给另外一个变量my

2在内部定义一个return {}

3通过my.get来访问立即函数中的变量*/


命名空间

就是可以解决污染问题,隔离代码

/*1000个人一起开发页面*/

varjd={

verstion:'1.0'

}

//公共模块--成员1

/*5个人开发*/

jd.common={

each:function(){},

map:function(){},

isArray:function(){},

isString:function(){}

}

/*ui模块:pc端的ui组件移动端成员2*/

/*10个人开发*/

jd.ui={}

jd.ui.pc={

/*tab组件*/

tab:function(){

console.log('pc端tab组件')

},

/*幻灯片*/

ppt:function(){},

/*导航*/

nav:function(){}

}

jd.ui.mobile={

/*tab组件*/

tab:function(){

console.log('移动端tab组件')

},

/*幻灯片*/

ppt:function(){},

/*导航*/

nav:function(){}

}

/*页面*/

/*100人开发*/

jd.page={}

/*产品相关的页面3*/

jd.page.prdouct={}

/*订单相关的页面4*/

jd.page.order={}

/*用户管理相关的页面5*/

jd.page.user={}

jd.page.finance={}

jd.page.pay={}

/*如何访问version

如何访问pc端这个tab方法

如何访问移动端tab方法*/

console.log(jd.verstion)

jd.ui.pc.tab()

jd.ui.mobile.tab()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,385评论 2 17
  • 深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大...
    DaveWeiYong阅读 3,790评论 0 1
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 6,423评论 1 10
  • 1、Math对象 Math.PI圆周率π Math.ceil()向上取整返回的是大于或等于函数参数,并且与之最接近...
    Lizzy95阅读 2,860评论 0 0
  • 函数声明和函数表达式有什么区别 (*)解析器会率先读取函数声明,并使其在执行任何代码之前可以访问;函数表达式则必须...
    coolheadedY阅读 3,003评论 0 1