首先开门见山,用一句话来概括,Javascript是没有块作用域的概念的,这是为什么呢,这听起来的确和其他的语言很不一样,上例子:
window.onload = function () {
outputNumber(4);
};
function outputNumber(count){
for(var i=0;i<count;i++){
document.write(i+"<br>");
}
alert(i);
}
用一个最简单的例子,在outputNumber函数里面执行for循环计数,最后的输出结果应该是undefined的,但是实际上却输出了4,循环中的i变量并没有清掉。这是和Java等语言不同的地方,在这个函数里面,定义的任何变量都是可以一直引用的,当退出函数,引用才会释放。
那么,有没有方法来模拟一下块作用域呢,肯定是有的,这里要了解一下匿名函数的特点,它的作用域链是包含其存在的外函数的,所以能够调用到全局变量和外变量,但是调用结束,其内部变量就会销毁,这样就达到了模拟块作用域的效果,示例如下:
window.onload = function () {
outputNumber(4);
};
function outputNumber(count){
(function () {
for (var i = 0; i < count; i++) {
document.write(i + "<br>");
}
})();
alert(i);//并没有值
}
这时候变量i就访问不到了。这个putputNumber里面是一个匿名函数,然后加上一个括号,最后再添加一个括号,表示立即运行,运行结束后就销毁运行环境了,这样在后面自然就访问不到i的值了。
使用这种方法(又叫私有作用域)还有一个好处,就是可以避免命名,这样在项目中有大量的变量存在时可以防止名字冲突。比如下面一个访问时间的例子:
(function (){
var nowtime = new Date();
document.write((Number(nowtime.getMonth())+1)+"月"+nowtime.getDate()+"日"+nowtime.getHours()+"时"+nowtime.getMinutes()+"分");
document.write("<br>"+"星期"+nowtime.getDay());
}
)();
这个例子正确的显示了日期和星期。它是可以直接运行的。