函数

对象
//我们以后可以定义不同的对象,来保存全局变量
/*就是将全局变量升级为对象的属性*/
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()
