一、匿名函数:没有函数名;单独的匿名函数是无法运行的,可通过把匿名函数赋值给变量来运行。
var dd = (function(){
return 'jack';
})();
alert(dd);// jack
二、块级作用域(私有作用域):
function box(){
{//for:块级作用域: 出了for的范围,i值未被销毁,而且不会被后面的重复声明覆盖掉
for (var i=0; i < 5; i++)
};
var i ; //但重新给i赋值则会覆盖掉原来的值
alert(i); //还是返回5:重新声明后值不会变
}
//使用块级作用域: 即使i出了块级作用域后就销毁
function box(){
(function(){//用包含自我执行的匿名函数来实现块级作用域
for(var i=0; i<5; i++){
alert(i);//变量i出了匿名函数后即被销毁
}
})();
alert(i);//出了匿名函数,i会不被识别
}
块级作用域用处:代替全局作用域。
//使用块级作用域实现,防止变更污染,不会有内存占用问题:匿名函数执行完就被销毁了
(function(){
var age = 150;
alert(age);
})();
alert(age);// 报未定义错误,说明 age在全局作用域中不会被访问到
三、私有属性(私有变量)
私有化运行机制:方式1:特权方法实现
function Box(){
var age = 100; //私有属性
function run(){ //私有方法
return '运行中....';
};
this.publicMethod = function(){//外部 可以访问的公共接口(特权方法)
return age + run();
};
}
var box = new Box();
//可以访问到函数内部私有的属性和方法
alert(box.publicMethod());
私有化运行机制:方式2:构造方法传参实现
function Desk(value){
var user = value; //私有变量
this.getUser = function(){//方法不会共享
return user;
};
this.setUser = function(value){//可通过特权方法实现赋值
user = value;
};
}
var d1 = new Desk('Lee');
var d2 = new Desk('kkk');
alert(d1.getUser());//返回Lee
alert(d2.getUser());//返回kkk
私有化运行机制:方式3:通过静态私有属性实现(即可以被不同的实例共享的属性):
(function (){ //匿名函数内部的构造函数外部无法访问,需将其设为全局变量方可
var user = ""; //私有变量
// Box = function(value){// 不加var,创建一个全局的构造 函数,使得外面可以访问
// user = value;
// this.getUser = function(){
// return user;
// };
// }; //一般不通过此方法共享
Box = function(value){// 一般通过原型来实现静态私有属性的访问,且属性是共享的
user = value;
};
Box.prototype.getUser = function(){
return user;
};
Box.prototype.setValue = function(value){
user = value;
};
})();
var b1 = new Box('lee');
var b2 = new Box('kkkk');
alert(b1.getUser());//返回lee
alert(b2.setUser('oooo'));
alert(b1.getUser());//此时会返回ooo, 因为是共享的