javascript没有块级作用域的概念,这意味着在块语句中定义的变量,实际上是在包含函数中而非在语句中创建。
私有变量
function create1(){
for(var i=0;i<5;i++){
alert(i)
}
alert(i)
}
create1() // 0、1、3、4、5 for循环语句定义的变量i是在包含函数中创建,而非for语句中。
可以用匿名函数来模仿块级作用域,用作块级作用域(通常称为私有作用域)
(function (){
//块级作用域
})(); 定义一个立即执行的匿名函数,包围函数声明的括号是将它表示为表达式。之后的括号是立即调用函数。
声明函数后面不能有()括号,只有表达式函数才可以。
声明函数只是声明,调用要通过函数名加括号,解析器会将声明函数提可以升到代码顶部,使其在任何代码之前可用。
function (){
}(); 报错// js引擎将函数当成声明函数。
私有变量
任何函数中定义的变量,都可以认为是私有变量,因为不能在函数的外部访问这些变量,私有变量包括函数的参数,局部变量和函数内部定义的其他函数。
静态私有变量
function add(num1,num2){
var sum=num1+num2
return sum
} // 私有变量 num1,num2和sum,外部不能访问
可以创建一个闭包通过作用域链来访问这些变量,有权访问私有变量和函数的公有方法叫特权方法
function Add(num1,num2){
var sum=num1+num2 //私有变量
function createFun(){
return num1; //私有函数
}
this.sayName=function(){ //公有方法
alert(sum);
}
this.sayCreates(){
return createFun();
}
}
var person=new Add(1,2);
person.sayName()// 3 公有方法
静态私有变量
静态私有变量,其实就是在构造函数的原型上添加公有方法,让每个实例都共享。
模块模式为单例创建私有变量和特权方法,单例是指只有一个实例的对象。
(function (num1,num2){
var sum=num1+num2;
function createFun(){ //私有变量、函数
return num1;
}
Person=function(){}; //构造函数 未声明的变量是全局创建的,Person是全局变量
Person.prototype.sayName=function(){ //公有方法
return sum;
} //作为闭包保存着对包含作用域的引用,
})();
模块模式
var modulePatterns(num1,num2){
var add=num1+num2; //私有变量和函数
function hiddens(){
return add;
}
return { 对象字面量作为函数返回值,包含一个特权方法。
sayName:function(){
hiddens();
}
}
}();