浅析四种常见的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检测客户端不是firefox则提示下载
Apr 07 Javascript
js语法学习之判断一个对象是否为数组
May 13 Javascript
js正则表达式匹配数字字母下划线等
Apr 14 Javascript
JS实现文字掉落效果的方法
May 06 Javascript
jQuery匹配文档链接并添加class的方法
Jun 26 Javascript
关于vue.js弹窗组件的知识点总结
Sep 11 Javascript
vue.js内部自定义指令与全局自定义指令的实现详解(利用directive)
Jul 11 Javascript
JS实现的3des+base64加密解密算法完整示例
May 18 Javascript
layui form表单提交后实现自动刷新
Oct 25 Javascript
详解Nuxt.js 实战集锦
Nov 19 Javascript
微信小程序用户盒子、宫格列表的实现
Jul 01 Javascript
Ant Design的可编辑Tree的实现操作
Oct 31 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下打开URL地址的几种方法小结
2010/05/16 PHP
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
2015/12/11 Javascript
微信小程序 检查接口状态实例详解
2017/06/23 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
2020/03/05 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
[49:41]NB vs NAVI Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
Python修改Excel数据的实例代码
2013/11/01 Python
Python判断字符串与大小写转换
2015/06/08 Python
开源软件包和环境管理系统Anaconda的安装使用
2017/09/04 Python
python生成随机图形验证码详解
2017/11/08 Python
python如何爬取个性签名
2018/06/19 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
Django中的forms组件实例详解
2018/11/08 Python
Python3实现取图片中特定的像素替换指定的颜色示例
2019/01/24 Python
Python3.5面向对象程序设计之类的继承和多态详解
2019/04/24 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
python在一个范围内取随机数的简单实例
2020/08/16 Python
Python实现对word文档添加密码去除密码的示例代码
2020/12/29 Python
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
vivo智能手机官方商城:vivo
2016/09/22 全球购物
解释一下ArrayList Vector和LinkedList的实现和区别
2013/04/26 面试题
英语专业毕业个人求职自荐信
2013/09/21 职场文书
竞选班长的演讲稿
2014/04/24 职场文书
预备党员党支部意见
2015/06/02 职场文书
2015年教导处教学工作总结
2015/07/22 职场文书
食堂管理制度范本
2015/08/04 职场文书