浅析四种常见的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的防止大图片撑破页面的实现代码(立即缩放)
Oct 24 Javascript
js/jquery去掉空格,回车,换行示例代码
Nov 05 Javascript
require.js深入了解 require.js特性介绍
Sep 04 Javascript
javascript实现倒计时N秒后网页自动跳转代码
Dec 11 Javascript
JavaScript中getUTCSeconds()方法的使用详解
Jun 11 Javascript
JS实现的跨浏览器解析XML文件实例
Jun 21 Javascript
js判断输入框不能为空格或null值的实现方法
Mar 02 Javascript
vue完成项目后,打包成静态文件的方法
Sep 03 Javascript
微信小程序实现swiper切换卡内嵌滚动条不显示的方法示例
Dec 20 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
May 20 Javascript
详解vue-property-decorator使用手册
Jul 29 Javascript
Vue v-for循环之@click点击事件获取元素示例
Nov 09 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/02/27 PHP
探讨GDFONTPATH能否被winxp下的php支持
2013/06/21 PHP
PHP中echo和print的区别
2014/08/28 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
JavaScript的面向对象方法以及差别
2008/03/31 Javascript
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
jQuery学习之prop和attr的区别示例介绍
2013/11/15 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
js实现树形数据转成扁平数据的方法示例
2020/02/27 Javascript
windows下wxPython开发环境安装与配置方法
2014/06/28 Python
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
python脚本监控docker容器
2016/04/27 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
python计算日期之间的放假日期
2018/06/05 Python
Python实现一个带权无回置随机抽选函数的方法
2019/07/24 Python
python 利用pyttsx3文字转语音过程详解
2019/09/25 Python
Django serializer优化类视图的实现示例
2020/07/16 Python
python opencv角点检测连线功能的实现代码
2020/11/24 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
打印机墨盒:123Inkjets
2017/02/16 全球购物
美国职棒大联盟官方网上商店:MLBShop.com
2017/11/12 全球购物
德国家具折扣店:POCO
2020/02/28 全球购物
超市实习总结自我鉴定
2013/09/19 职场文书
诚信承诺书范文
2014/03/27 职场文书
高中生第一学年自我鉴定
2014/09/12 职场文书
教师党员整改措施
2014/10/24 职场文书
2014年安全生产工作总结
2014/11/13 职场文书
横店影视城导游词
2015/02/06 职场文书
茶楼服务员岗位职责
2015/02/09 职场文书