浅析四种常见的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文字上下滚动的实现方法
Mar 22 Javascript
AngularJS入门教程之AngularJS表达式
Apr 18 Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
Oct 28 Javascript
canvas实现绘制吃豆鱼效果
Jan 12 Javascript
JS实现为动态创建的元素添加事件操作示例
Mar 17 Javascript
Javascript实现购物车功能的详细代码
May 08 Javascript
对vue事件的延迟执行实例讲解
Aug 28 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
Nov 06 Javascript
详细分析vue响应式原理
Jun 22 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
Oct 29 Javascript
使用node-media-server搭建一个简易的流媒体服务器
Jan 20 Javascript
JavaScript流程控制(循环)
Dec 06 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脚本的10个技巧(1)
2006/10/09 PHP
destoon安全设置中需要设置可写权限的目录及文件
2014/06/21 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
JavaScript 设计模式学习 Singleton
2009/07/27 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
JS创建对象几种不同方法详解
2016/03/01 Javascript
vue日期组件 支持vue1.0和2.0
2017/01/09 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
简单谈谈CommonsChunkPlugin抽取公共模块
2017/12/31 Javascript
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
Python实现发送email的几种常用方法
2014/08/18 Python
在Django中创建动态视图的教程
2015/07/15 Python
Python Socket编程详细介绍
2017/03/23 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
Python绘制堆叠柱状图的实例
2019/07/09 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
使用python批量转换文件编码为UTF-8的实现
2020/04/03 Python
深入了解Python装饰器的高级用法
2020/08/13 Python
15个Pythonic的代码示例(值得收藏)
2020/10/29 Python
OpenCV灰度化之后图片为绿色的解决
2020/12/01 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
Canvas高级路径操作之拖拽对象的实现
2019/08/05 HTML / CSS
结构和类有什么异同
2012/07/16 面试题
介绍下java.util.Arrays类
2012/10/16 面试题
元旦晚会上单位领导演讲稿
2014/01/05 职场文书
请假条格式范文
2014/04/10 职场文书
抗洪抢险事迹材料
2014/05/06 职场文书
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
企业财务人员岗位职责
2015/04/14 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
Python基础知识之变量的详解
2021/04/14 Python
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python