一.匿名函数
把匿名函数赋值给变量
var box=function(){
return 'lee';
}
alert(box());
通过表达式自我执行
(function(){
return 'lee';
})();
把自我执行后的函数赋值给box;
var box=(function(){
return 'lee';
})();
alert(box);
二. 闭包
function box (){
return function(){
return 'lee';
}
}
alert(box()());
var b=box();
alert(b()); //更灵活一点
1.通过闭包返回局部变量 (使用闭包有一个优点和缺点 ,就是可以使局部变量驻留在原来的内存中)
function box(){ var age=100; return function(){ return age; } } function box(){ var age=100; return function(){ age ++; return age; } } var b=box(); alert(b()); alert(b()); 从而实现累加
2.循环里面的匿名函数
function box(){
var arr=[];
for (var i = 0; i < 5; i++) {
arr[i]=(function(num){
return num;
})(i);
}
return arr;
}
alert(box());
function box(){
var arr=[];
for (var i = 0; i < 5; i++) {
arr[i]=(function(num){ 驻留在作用域
return num;
})(i);
}
return arr;
}
var box1=box();
for (var i = 0; i < 5; i++) {
alert(box1[i]);
}
3.Javascript 没有块级作用域(模仿块级作用域)
function box(){ var arr=[]; for (var i = 0; i < 5; i++) { } alert(i); 仍然可以调用i } box(); 包含自我执行的匿名行数 就可以使用块级作用域 私有域控制全局变量 function box(){ (function(){ for (var i = 0; i < 5; i++) { }})(); alert(i); } box(); //包含自我执行的匿名函数就可以实现块级作用域 每个开发者可以使用自己的变量 不会搞坏全局变量 私有作用域 (function(){ var age=100; alert(age); })();
关于this对象
在闭包中this指向的是Window
var box ={
user:'abc',
getUser:function(){
var that=this;
return function(){
return this;
return that;
}
}
}
alert(box.getUser()()); object window
解决办法1.对象冒充 alert(box.getUser().call(box)); 否则会发生内存泄漏
解决办法办法2 var that=this
私有变量
function(){ var age=100; // 私有变量 } function Box(){ var age=100; function run(){ return "运行中"; } this.publicgo=function(){ //对外可见的公共接口 特权方法 ruturn age+run(); } this.getAge=function(){ return age; } } var box=new Box(); alert(box.getAge());
静态私有变量
共享不同对象的属性,都能访问到被其他对象改变的值
(function(){
var user=' ';
Box=function(value){
user=value;
}//全局构造函数
Box.prototype.getUser=function(){
return user;
}
})();
var box=new Box('lll');
alert(box.getUser());
var box2=new Box('kkk');
alert(box.getUser());
单例 就是永远只实例化一次 其实就是字面量对象声明方式
var box={
user:'lll';
run:function(){
return " 运行中”;
}
}