在今天将为大家分享一下,在平时我们写js代码的时候应该注意的一些的小点。
img1
全局变量
了解js的朋友应该知道全局变量就是在任何函数的外面声明的或是未声明直接简单使用的。下面来看一个例子
function
fn(){
var
a=b=0;
}
或许有好多朋友都觉得这两个都是局部变量,但这似乎不是你所想的那样。在这个例子中b是一个全局变量。这是为什么了?肯定有好多朋友也想不通,这是因为在js中赋值运算符是自右往左的,所以上面这个例子实际上是
function
fn(){
var
a=(b=0);
}
因此,在平时写js代码的应该多加小心你所定义的变量。
变量声明
在没说之前,先让大家来看一个例子
name=”global”
function
fn(){
alert(name);
var
name=’local’;
alert(name);
}
fn()
当一看到这个例子的时候,有人肯定会一下子想到这结果一定是”global”,”local”,但当你如果一运行这结果会你惊,这铝合金气动隔膜泵结果就是”undefined”,”local”。这是因为什么了?是因为变量在同一作用域(同一函数)中,声明都是被提至作用域顶部先进行解析的。
函数声明
函数声明跟变量声明也是一样的也是被提前至作用域顶部,先于任何表达式和语句被铝合金气动隔膜泵解析和求值的。
接下来又给大家举一例子
function
test(){
alert(“1″);
}
test();
function
test(){
alert(“2″);
}
test()
这个运行结果不是“1”和“2”,而是两个“2”,道理很简单,test()的声明短先于test()被解析。
函数表达式
先看命名函数表达式,理所当然,就是它得有名字,比如:
var
box=function fn(){
}
值得注意的是:函数名只对其函数内部可见,比如:
var box=function
fn(){
fn();
};
fn();
尽量少用命名函数表达式,切勿将函数名使用于外部。
函数的自执行
对于函数表达式,可以通过后面加上
() 自执行,而且可在括号中传递参数,而函数声明不可以。又比如:
function
fn(){
alert(x);
}
循环中的闭包
var
links=document.getElementsByTagName(“ul”)[0].getElementsByTagName(“a”);
for(var
i=0;i<links.length;i<1;i++)
{http://www.hainnu.edu.cn/
links[i].onclick=function(e){
e.preventDefault();
alert(“you
click link #”+i)
}
}
我们预期当点击第 i 个链接时,得到此序列索引 i 的值,可实际无论点击哪个链接,得到的都是 i
在循环后的最终结果:”5”。
原因:当 alert 被调用时,for 循环内的匿名函数表达式,保持了对外部变量
i的引用(闭包),此时循环已结束,i 的值被修改为 “5”。
解决:为了得到想要的结果,需要在每次循环中创建变量 i
的拷贝。以下演示正确的做法:
var
links=document.getElementsByTagName(“ul”)[0].getElementsByTagName(“a”);
for(var
i=0;l=link.length;i<l;i++){
links[i].onclick=(function (index){
return
function(e){
e.preventDefault();
alert(“you click link
#”+index);
}
})(i);
}