浅析四种常见的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 相关文章推荐
javascript中Object使用详解
Jan 26 Javascript
大型JavaScript应用程序架构设计模式
Jun 29 Javascript
解决wx.onMenuShareTimeline出现的问题
Aug 16 Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
Oct 30 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
Mar 01 Javascript
Angular数据绑定机制原理
Apr 17 Javascript
使用layui 渲染table数据表格的实例代码
Aug 19 Javascript
JS获取并处理php数组的方法实例分析
Sep 04 Javascript
20道JS原理题助你面试一臂之力(必看)
Jul 22 Javascript
微信小程序 WXML节点信息查询详解
Jul 29 Javascript
node.js使用fs读取文件出错的解决方案
Oct 23 Javascript
微信小程序实现点击按钮后修改颜色
Dec 05 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
模仿OSO的论坛(四)
2006/10/09 PHP
又一个php 分页类实现代码
2009/12/03 PHP
php sybase_fetch_array使用方法
2014/04/15 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
用正则xmlHttp实现的偷(转)
2007/01/22 Javascript
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
2010/01/22 Javascript
基于jQuery的仿flash的广告轮播
2010/11/05 Javascript
js二维数组定义和初始化的三种方法总结
2014/03/03 Javascript
分享十五款 jQuery 社交网络分享插件
2015/05/16 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
jQuery使用deferreds串行多个ajax请求
2016/08/22 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
2016/10/19 Javascript
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
2020/01/11 jQuery
js 实现碰撞检测的示例
2020/10/28 Javascript
vue 递归组件的简单使用示例
2021/01/14 Vue.js
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
[45:32]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python3.5集合及其常见运算实例详解
2019/05/01 Python
Python 动态导入对象,importlib.import_module()的使用方法
2019/08/28 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
Python双链表原理与实现方法详解
2020/02/22 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
2020/06/30 Python
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
2014/05/15 HTML / CSS
信息总监管理职责范本
2014/03/08 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
2014保险公司个人工作总结
2014/12/09 职场文书
2015年银行员工工作总结
2015/04/24 职场文书
工作简报范文
2015/07/21 职场文书
2016大学优秀学生干部事迹材料
2016/03/01 职场文书