模仿块级作用域
var somefunction=function(){
///这里是块级作用域
}
somefunction();
在这里定义了一个函数,然后立即调用。不会报错。
然而,下面的代码:
function(){
//这里是块级作用域
}(); //出错
这段代码会导致语法错误,因为javascript将function关键字当做一个函数声明的开始,而函数声明后不能跟圆括号。
然而函数表达式的后面可以跟圆括号。将函数声明转为函数表达式,像下面给它加上一对圆括号就可以了:
(function(){
//这里是块级作用域
})();
(function(){
var now = new Date();
if(now.getMonth() ==0 && now.getDate() ==1){
alert("happy year");
}
})();
这段代码放到全局作用域中,确定那天是1月1日,显示新年快乐。这种做法减少闭包占用内存的问题,因为没有指向匿名函数的引用。执行完毕,立即销毁作用域链。
静态私有变量
通过私有作用域中定义私有变量或函数,可以创建特权方法:
(function(){
//私有变量
var privateVariable = 10;
//私有函数
function privateFunction(){
return false;
}
//构造函数
MyObject = function (){};
//特权方法
MyObject.prototype.piblicMethod = function (){
privateVariable++;
return privateFunction();
}
})();
这个模式在定构造函数时并没有使用函数声明,而是使用函数表达式。
初始化未经声明的变量,总是会创建一个全局变量。因此Myobject成为一个全局变量。但是在严格模式下给未经声明的变量赋值会导致错误。