写js代码的时候应该注意的一些的小细节
2014-05-04 11:13
323 查看
在今天将为大家分享一下,在平时我们写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);
}
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);
}
相关文章推荐
- 构造JSON数组字符串
- Jsp:taglib实现
- cJSON
- js截取字符串
- 神奇的JS代码for响应式
- javascript数组总结(0504)
- Javascript中Closure及其相关概念
- Jsoncpp写“鱘”的json数据,报错。
- Javascript DOM 03 表格添加、删除 + 搜索
- ExtJS2.2树的级联选择
- ExtJS 2使用经验(树、表格树、RadioGroup)
- JSP遇到的各种中文乱码问题
- Javascript:10天设计一门语言
- JSONP跨域实例
- js常用定时器 利用包装传参
- jsoup中文参考手册
- Seen.js – 使用 SVG 或者 Canvas 渲染 3D 场景
- js弹出的三种对话框
- JavaScript判断图片是否加载完成的三种方式
- JavaScript获取图片的原始尺寸