JavaScript 中的陷阱
全局变量
functionfoo(){
vara=b=0;
// body...
}
functionfoo(){
vara=(b=0);
// body...
}
变量声明
myName="global";
functionfoo(){
alert(myName);
varmyName="local";
alert(myName);
}
foo();
functionfoo(){
varmyName;
alert(myName);// "undefined"
myName="local";
alert(myName);// "local"
}
vara=1;
}
alert(a);
vara;// "undefined"
console.log("a"inwindow);// true
if(!("a"inwindow)){
vara=1;// 不执行
}
alert(a);// "undefined"
函数声明
alert(typeoffoo);// "function"
functionfoo(){
// body...
}
alert(typeoffoo);// "undefined"
varfoo=function(){
// body...
};
functiontest(){
alert("1");
}
test();
functiontest(){
alert("2");
}
test();
函数表达式
varbar=functionfoo(){
// body...
};
varbar=functionfoo(){
foo();// 正常运行
};
foo();// 出错:ReferenceError
函数的自执行
// (1) 这只是一个分组操作符,不是函数调用!
// 所以这里函数未被执行,依旧是个声明
functionfoo(x){
alert(x);
}(1);
// 标准的匿名函数表达式
varbar=functionfoo(x){
alert(x);
}(1);
// 前面的 () 将 function 声明转化为了表达式
(functionfoo(x){
alert(x);
})(1);
// 整个 () 内为表达式
(functionfoo(x){
alert(x);
}(1));
// new 表达式
newfunctionfoo(x){
alert(x);
}(1);
// &&, ||, !, +, -, ~ 等操作符(还有逗号),在函数表达式和函数声明上消除歧义
// 所以一旦解析器知道其中一个已经是表达式了,其它的也都默认为表达式了
true&&functionfoo(x){
alert(x);
}(1);
循环中的闭包
var links = document.getElementsByTagName("ul")[0].getElementsByTagName("a");
for (var i = 0, l = links.length; i < l; i++) {
links[i].onclick = function (e) {
e.preventDefault();
alert("You click link #" + i);
}
}
varlinks=document.getElementsByTagName("ul")[0].getElementsByTagName("a");
for(vari=0,l=links.length;i<l;i++){
links[i].onclick=(function(index){
returnfunction(e){
e.preventDefault();
alert("You click link #"+index);
}
})(i);
}
for(vari=0,l=links.length;i<l;i++){
(function(index){
links[i].onclick=function(e){
e.preventDefault();
alert("You click link #"+index);
}
})(i);
}
建议继续学习:
- Java陷阱(2010版) (阅读:3745)
- JavaScript性能陷阱 (阅读:3734)
- PHP数据类型隐性转换的陷阱 (阅读:3614)
- 移动互联网系统架构十大陷阱 (阅读:3387)
- 类型转换-无处不在的陷阱 (阅读:2929)
- cPickle序列化自定义类实例时的陷阱 (阅读:2302)
- 情景反射陷阱 (阅读:2269)
- 可能被你忽略的 JavaScript 代码陷阱 (阅读:2138)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:天涯孤雁 来源: WEB前端开发
- 标签: 陷阱
- 发布时间:2013-08-26 23:09:39
-
[886] WordPress插件开发 -- 在插件使用 -
[136] 解决 nginx 反向代理网页首尾出现神秘字 -
[56] 整理了一份招PHP高级工程师的面试题 -
[54] 分享一个JQUERY颜色选择插件 -
[54] Innodb分表太多或者表分区太多,会导致内 -
[54] 如何保证一个程序在单台服务器上只有唯一实例( -
[53] jQuery性能优化指南 -
[52] 用 Jquery 模拟 select -
[52] 海量小文件存储 -
[51] CloudSMS:免费匿名的云短信
