浅析四种常见的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 剧场版 你必须知道的javascript
May 27 Javascript
基于jQuery实现点击同时更改两个iframe的网址
Jul 01 Javascript
jquery lazyload延迟加载技术的实现原理分析
Jan 24 Javascript
jquery 隐藏与显示tr标签示例代码
Jun 06 Javascript
jQuery中scrollTop()方法用法实例
Jan 16 Javascript
javascript正则表达式中的replace方法详解
Apr 20 Javascript
老生常谈javascript的类型转换
Oct 12 Javascript
Javascript循环删除数组中元素的几种方法示例
May 18 Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
May 08 Javascript
微信小程序支付PHP代码
Aug 23 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
Aug 24 Javascript
vue实现简单跑马灯效果
May 25 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中GET变量的使用
2006/10/09 PHP
PHP下几种删除目录的方法总结
2007/08/19 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
2015/02/12 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
2015/09/20 PHP
使用Yii2实现主从数据库设置
2016/11/20 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
javascript addBookmark 加入收藏 多浏览器兼容
2009/08/15 Javascript
firefox下jquery iframe刷新页面提示会导致重复之前动作
2012/12/17 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
PageSwitch插件实现100种不同图片切换效果
2015/07/28 Javascript
jquery仿百度百科底部浮动导航特效
2015/08/08 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
原生JS实现图片轮播切换效果
2016/12/15 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件的方法
2017/09/20 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
JS中判断字符串存在和非空的方法
2018/09/12 Javascript
学习node.js 断言的使用详解
2019/03/18 Javascript
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
Vue3.0中的monorepo管理模式的实现
2019/10/14 Javascript
微信小程序语音同步智能识别的实现案例代码解析
2020/05/29 Javascript
Python中栈、队列与优先级队列的实现方法
2019/06/30 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
python连接PostgreSQL过程解析
2020/02/09 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
Pytorch高阶OP操作where,gather原理
2020/04/30 Python
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
新奥尔良珠宝:Mignon Faget
2020/11/23 全球购物
岗位职责的定义
2013/11/10 职场文书
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS