浅析四种常见的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 相关文章推荐
通过js脚本复制网页上的一个表格的不错实现方法
Dec 29 Javascript
File文件控件,选中文件(图片,flash,视频)即立即预览显示
Apr 09 Javascript
Javascript模块化编程(一)模块的写法最佳实践
Jan 17 Javascript
jquery中的on方法使用介绍
Dec 29 Javascript
JavaScript中使用document.write向页面输出内容实例
Oct 16 Javascript
JS动态修改iframe高度和宽度的方法
Apr 01 Javascript
JS弹出对话框实现方法(三种方式)
Dec 18 Javascript
js中scrollTop()方法和scroll()方法用法示例
Oct 03 Javascript
javascript创建对象的3种方法
Nov 02 Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
Aug 14 Javascript
JavaScript创建对象的七种方式全面总结
Aug 21 Javascript
ES6中的Promise代码详解
Oct 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下的权限算法的实现
2007/04/28 PHP
浅析Mysql 数据回滚错误的解决方法
2013/08/05 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
js购物车实现思路及代码(个人感觉不错)
2013/12/23 Javascript
利用Jquery实现可多选的下拉框
2014/02/21 Javascript
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
mockjs,json-server一起搭建前端通用的数据模拟框架教程
2017/12/18 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
获取layer.open弹出层的返回值方法
2018/08/20 Javascript
vue-cli项目无法用本机IP访问的解决方法
2018/09/20 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
JavaScript事件循环及宏任务微任务原理解析
2020/09/02 Javascript
python操作sqlite的CRUD实例分析
2015/05/08 Python
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
利用Python爬取微博数据生成词云图片实例代码
2017/08/31 Python
Python3.4实现远程控制电脑开关机
2018/02/22 Python
Python魔法方法功能与用法简介
2019/04/04 Python
python爬虫 urllib模块发起post请求过程解析
2019/08/20 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
悬挂训练绳:TRX
2017/12/14 全球购物
成立公司计划书
2014/05/07 职场文书
优秀共产党员演讲稿
2014/09/04 职场文书
法人委托书范本
2014/09/15 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
儿园租房协议书范本
2014/12/02 职场文书
社区结对共建协议书
2016/03/23 职场文书
Go语言并发编程 sync.Once
2021/10/16 Golang
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL
Python&Matlab实现樱花的绘制
2022/04/07 Python