Tips: 内容为知识梳理javascript
定义函数有两种方式:函数
function name(arg0,arg1,arg2){
//代码
}
复制代码
函数名.name
能够访问函数名var name =function(arg0,arg1,arg2){
//代码
};
复制代码
var factorial = (function f(num){
if (num <= 1){
return 1;
} else {
return num * f(num-1);
}
});
复制代码
上面函数名为f,赋值给了factorial。ui
function ceee(){
var sum=new Array();
for(i=0;i<10;i++){
sum[i]=function(){
return i;
};
}
retuen sum;
}
复制代码
此函数返回的数组都是10,由于闭包做用域链保存着包含函数的活动对象,它们引用的都是同一个i,当包含函数返回后,i等于10,因此数组都为10var name="abc";
var ob=function(){
name:"fff",
getname:function(){
return function(){
return this.name;
};
}
};
复制代码
上面代码的this指向window,由于对于最里面的函数的做用域链,它在搜索this时,逐层往上搜索,由于本身的活动对象中存在this,而这个this是指向全局的,因此不会再往上搜索包含函数的this(不知道这样说你理解没有,反正我是理解了),修改方法是把this先保存在一个变量中,再在闭包调用这个变量,此时的this就是指向包含函数javascript无块级做用域概念,即在块语句中定义的变量其实也是存在于包含他的外部函数的做用域链中,而不是像java和c语言同样在块语句结束后就被销毁。this
(function(){
//这里是块级做用域
})();
复制代码
匿名函数即函数表达式后面能够跟圆括号表示当即调用,而函数声明即有名函数后面不能够跟圆括号function mobj(){
var num=1;//私有变量
this.meth = function(){
return num;
};//特权方法
}
复制代码
这样就能够在外部经过访问meth这个函数属性来访问私有变量用原型模式和匿名函数将私有变量变为全部实例共享,具体以下spa
(function (){
var name="abd";//私有变量
mbu = function(){};
mbu.prototype.publicmetho =function(){
return name;
};//在原型对象中设置属性
})();
复制代码
上面代码首先是建立一个私有做用域,而后定义一个私有变量,再不使用var定义一个全局变量mbu,再对mbu的原型对象添加属性publicmethoprototype
为单例建立私有变量和特权方法,语法以下:
var single = function(){
var pria =20;//私有变量
return {
publicee :10;
publicmetho: function(){
return pria;
}//返回一个以字面量建立的对象
};
}();
复制代码
上面代码返回了一个以字面量建立的对象,这个对象能够访问私有变量
加强模块模式即在返回对象前加入对其加强的代码,这种模式适合那些单例必须是某种类型的实例,同时还必须添加某些属性或方法对其加强的状况。