浅析四种常见的Javascript声明循环变量的书写方式


Posted in Javascript onOctober 14, 2015

Javascript中的循环变量声明,到底应该放在哪儿?

浅析四种常见的Javascript声明循环变量的书写方式

习惯1:不声明直接使用

function loop(arr) { 
 for (i = 0; i < arr.length; i++) { 
  // do something 
 } 
}

非常危险的使用习惯,一般情况下循环变量将成为window对象上的一个属性被全局使用,极有可能影响程序的正常逻辑实现。
需要着重提一下的是,在strict模式下,未声明变量而直接赋值的使用方式会直接抛出异常,早就该这么做啦!引用一下ecma-262标准附录C中的一段话:
"Assignment to an undeclared identifier or otherwise unresolvable reference does not create a property in the global object. When a simple assignment occurs within strict mode code, its LeftHandSide must not evaluate to an unresolvable Reference. If it does a ReferenceError exception is thrown (6.2.3.2)."
换言之,如果再使用未经声明的变量的话,ReferenceError异常会被抛出。

习惯2:放在for循环初始语句块中并反复声明

function loop(arr) { 
 for (var i = 0; i < arr.length; i++ ){ 
  // do someting 
 } 
 // console.log(i); 
 for (var i = 0; i < arr.length; i++ ){ 
  // do something else 
 } 
}

这种方式看似最安全规范,很多从C和Java转到前端开发的同学都偏爱这样的写法,事实上,这也许是由于对Javascript中一个重要概念有所 误解造成的——变量作用域。不同于C和Java,Javascript并不具备真正的块级作用域,也就是说,在第一个循环结束之 后,console.log(i)并不会打印undefined或者抛出ReferenceError异常,而是会正常打印出arr.length。
当然,这样的写法虽然除了美观以外意义不大,但是长久以来兼容性良好且没有违反任何规范——ecma标准中并没有禁止在某一个作用域内对于同一变量的重复声明。

习惯3:在函数顶部和其他变量一起集中定义

function loop(arr) { 
 var var1; 
 var var2; 
 var i; 
 
 for (i = 0; i < arr.length; i++) { 
  // do something 
 } 
}

这种c89-like式的变量定义方式在Javascript中几乎无可挑剔,既不会造成Javascript支持块级作用域的误解,又不会污染全 局scope,还不违反任何标准和规范,主要缺点就是循环变量的声明和循环体可能会隔开比较远。在不借助更多代码的前提下,除了等待各大主流浏览器厂商实现ECMAScript 6中的let关键字以外,这个问题似乎找不到更好的解决方案。

习惯4:将循环代码封装到IIFE中

function loop(arr) { 
 (function () { 
  for (var i = 0; i < arr.length; i++) { 
   // do something 
  } 
 })(); 
}

最后一种习惯是前端程序员们熟悉的IIFE(Immediately-Invoked Function Expression),即立即执行函数。此种方法的主要缺点是书写相对麻烦,且有多余的性能损耗(很小),但在兼容性、对各标准规范的遵循上表现良好。 如果不嫌麻烦,开发者可以采取这种方式。

以上就是对Javascript中四种常见循环变量定义书写习惯的简单介绍和分析,各有利弊,读者可以结合自己的需求择优使用。

Javascript 相关文章推荐
jQuery LigerUI 使用教程入门篇
Jan 18 Javascript
javascript实现文本域写入字符时限定字数
Feb 12 Javascript
javascript类型转换示例
Apr 29 Javascript
Angularjs制作简单的路由功能demo
Apr 14 Javascript
jquery.validate 自定义验证方法及validate相关参数
Jan 18 Javascript
详解JavaScript正则表达式之分组匹配及反向引用
Mar 09 Javascript
AngularJS使用ng-options指令实现下拉框
Aug 23 Javascript
在web中js实现类似excel的表格控件
Sep 01 Javascript
利用Node.js+Koa框架实现前后端交互的方法
Feb 27 Javascript
IntersectionObserver实现图片懒加载的示例
Sep 29 Javascript
vue.js打包之后可能会遇到的坑!
Jun 03 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
Dec 20 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
Oct 14 #Javascript
JS更改select内option属性的方法
Oct 14 #Javascript
JavaScript+CSS实现仿Mootools竖排弹性动画菜单效果
Oct 14 #Javascript
JS实现的最简Table选项卡效果
Oct 14 #Javascript
JS仿淘宝实现的简单滑动门效果代码
Oct 14 #Javascript
JavaScript实现的伸展收缩型菜单代码
Oct 14 #Javascript
smartcrop.js智能图片裁剪库
Oct 14 #Javascript
You might like
php异常处理技术,顶级异常处理器
2012/06/13 PHP
PHP 观察者模式的实现代码
2013/05/10 PHP
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
2014/06/12 PHP
PHP下载远程图片并保存到本地方法总结
2016/01/22 PHP
js一组验证函数
2008/12/20 Javascript
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
javascript实现了照片拖拽点击置顶的照片墙代码
2015/04/03 Javascript
Node.js编程中客户端Session的使用详解
2015/06/23 Javascript
关于JavaScript的变量的数据类型的判断方法
2015/08/14 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
Python字符串格式化
2015/06/15 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
Python升级导致yum、pip报错的解决方法
2017/09/06 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
python列表返回重复数据的下标
2020/02/10 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
后端开发使用pycharm的技巧(推荐)
2020/03/27 Python
Django Session和Cookie分别实现记住用户登录状态操作
2020/07/02 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
Jupyter Notebook 安装配置与使用详解
2021/01/06 Python
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
学校后勤岗位职责
2014/02/19 职场文书
大学生新学期计划书
2014/04/28 职场文书
实习介绍信模板
2015/01/30 职场文书
员工加薪申请报告
2015/05/15 职场文书
起诉书格式范文
2015/05/20 职场文书
小学生手册家长意见
2015/06/03 职场文书
Jupyter notebook 更改文件打开的默认路径操作
2021/05/21 Python
python 实现图与图之间的间距调整subplots_adjust
2021/05/21 Python
Python基本数据类型之字符串str
2021/07/21 Python
css中z-index: 0和z-index: auto的区别
2021/08/23 HTML / CSS
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫
A22国内电台短波广播频率表
2022/05/10 无线电