Professional javascript For Web Developers 第2版读书笔记第3集
前面好像说过,js中没有类似c#,java的语法区块的概念。在for循环中定义的变量,离开了循环体后,仍然可以使用,如:
function outputNumbers(count){
for (var i=0; i < count; i++){
alert(i);
}
alert(i); //count
}
for (var i=0; i < count; i++){
alert(i);
}
alert(i); //count
}
另外,就算在声明一个变量,并且赋值后再声明这个变量不会有任何问题,js会忽略重复的声明
function outputNumbers(count){
for (var i=0; i < count; i++){
alert(i);
}
var i; //variable redeclared
alert(i); //count
}
for (var i=0; i < count; i++){
alert(i);
}
var i; //variable redeclared
alert(i); //count
}
c#和java中语法区块的作用是用来控制变量的作用域,可js不能直接这样使用,需要采取变通方法,如:
(function(){
//block code here
})();
//block code here
})();
函数的声明被一对圆括号包围,因此js会认为圆括号包围的是表达式,同时表达式范围内的变量是无法被外部引用的,因此可以模拟出类似区块的概念,如:
function outputNumbers(count)
{
(function ()
{
for (var i=0; i < count; i++)
{
alert(i);
}
})();
alert(i); //causes an error
}
{
(function ()
{
for (var i=0; i < count; i++)
{
alert(i);
}
})();
alert(i); //causes an error
}
匿名函数内部定义的变量当匿名函数执行结束便会销毁,因此外部无法引用到,但是匿名函数能访问count,因为匿名函数形成一个闭包。
使用这种方式的好处:
1.使用这种方式可以有效的减少定义在全局上下文window内的对象,对于多人协作开发的页面,可以减少命名冲突发生,每个开发人员可以使用他们喜欢的命名而不用担心会污染到全局上下文window
(function(){
var now = new Date();
if (now.getMonth() == 0 & & now.getDate() == 1){
alert(“Happy new year!”);
}
})();
var now = new Date();
if (now.getMonth() == 0 & & now.getDate() == 1){
alert(“Happy new year!”);
}
})();
2.此方式有效减少了闭包的内存问题,因为没有指向匿名函数的引用了,因此匿名函数作用域链在函数执行完毕便销毁。
posted on 2010-07-27 11:25 MoonWalker 阅读(251) 评论(0) 编辑 收藏 举报