匿名函数和闭包
一.匿名函数
把匿名函数赋值给变量
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 " 运行中”; } }