javascript没有块作用域的概念,只要是在块语句中定义的变量,实际上都是包含在函数中的。因此想要使用块作用域,需要再嵌套在一个函数中。例:
function alertDate(){
(function(){
var date = new Date();
if(date.getMonth == 0 && date.getDate() ==1){
alert("happy new year!");
}
})();
alert(date);//会报错
}
私有变量:任何在函数中定义的变量,都是私有变量,不能在函数外部访问这些变量。私有变量包括函数的参数、局部变量、函数内部定义的其他函数。如果想要在外部访问这些变量,需要使用this,升级为特权变量。其思想类似于java中的public 方法或变量。例:
function Person(name){
this.getName = function(){
return name;
};
this.setName(name){
this.name = name;
};
}
var person1 = new Person("xiaoming");
alert(person1.getName());//xiaoming
person1.setName("xiaohong");
alert(person1.getName());//xiaohong
静态私有变量:在原型上定义公有方法。
( function(){
var privateVariable = 10;
function privateFunction(){
return false;
}
MyObject = function(){};
MyObject.prototype.publicMethod = function(){
privateVariable ++;
return privateFunction();
};
})();
和构造函数上定义特权方法的区别是,私有变量和函数是实例共享的。而原型上是都是用同一个函数,所以所有的实例操作它,都会改变该函数改变的值。
模块模式:为单里创建私有变量和特权的方法。单例指的是只有一个实例的对象。
var singleton = function(){
var name = "xiaoming";
function getName(){ return "xiaoming";}
return {
publicName: "heihei";
publicMethod: function(){
name = "xiaohong";
return getName();
}
};
}();
增强的模块模式:适用于单例必须是某种特定类型的实例,同时还必须添加某些属性和方法对其加以增强的情况。
var singlton = function(){
var privateVariable = 10;
function privateFunction(){
return false;
}
MyObject = new Custom(){};
MyObject.publicMethod = function(){
privateVariable ++;
return privateFunction();
};
return MyObject;
}();