Javascript中的循环变量声明,到底应该放在哪儿?

不放走任何一个细节。相信很多Javascript开发者都在声明循环变量时犹
豫过var
i到底应该放在哪里:放在不同的位置会对程序的运行产生怎样的影响?哪一种方式符合Javascript的语言规范?哪一种方式和ecma标准未来的发展
方向匹配?本文将对四种常见的声明循环变量的书写方式进行简单的分析和比较。

习惯1:不声明直接使用


  1. function loop(arr) { 
  2.     for (i = 0; i < arr.length; i++) { 
  3.         // do something 
  4.     } 

非常危险的使用习惯,一般情况下循环变量将成为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循环初始语句块中并反复声明


  1. function loop(arr) { 
  2.     for (var i = 0; i < arr.length; i++ ){ 
  3.         // do someting 
  4.     } 
  5.     // console.log(i); 
  6.     for (var i = 0; i < arr.length; i++ ){ 
  7.         // do something else 
  8.     } 

这种方式看似最安全规范,很多从C和Java转到前端开发的同学都偏爱这样的写法,事实上,这也许是由于对Javascript中一个重要概念有所
误解造成的——变量作用域。不同于C和Java,Javascript并不具备真正的块级作用域,也就是说,在第一个循环结束之
后,console.log(i)并不会打印undefined或者抛出ReferenceError异常,而是会正常打印出arr.length。

然,这样的写法虽然除了美观以外意义不大,但是长久以来兼容性良好且没有违反任何规范——ecma标准中并没有禁止在某一个作用域内对于同一变量的重复声
明。不仅如此,其实这里还有一个另外好消息,在ECMAScript
6中,一个新的,为支持真正的块级作用域而生的关键字出现了——let。这里放一个传送门,有兴趣的同学可以自行了解:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

习惯3:在函数顶部和其他变量一起集中定义


  1. function loop(arr) { 
  2.     var var1; 
  3.     var var2; 
  4.     var i; 
  5.  
  6.     for (i = 0; i < arr.length; i++) { 
  7.         // do something 
  8.     } 

这种c89-like式的变量定义方式在Javascript中几乎无可挑剔,既不会造成Javascript支持块级作用域的误解,又不会污染全

局scope,还不违反任何标准和规范,主要缺点就是循环变量的声明和循环体可能会隔开比较远。在不借助更多代码的前提下,除了等待各大主流浏览器厂商实
现ECMAScript 6中的let关键字以外,这个问题似乎找不到更好的解决方案。

习惯4:将循环代码封装到IIFE中


  1. function loop(arr) { 
  2.     (function () { 
  3.         for (var i = 0; i < arr.length; i++) { 
  4.             // do something 
  5.         } 
  6.     })(); 
  7. }

最后一种习惯是前端程序员们熟悉的IIFE(Immediately-Invoked Function
Expression),即立即执行函数。此种方法的主要缺点是书写相对麻烦,且有多余的性能损耗(很小),但在兼容性、对各标准规范的遵循上表现良好。
如果不嫌麻烦,开发者可以采取这种方式。

以上就是对Javascript中四种常见循环变量定义书写习惯的简单介绍和分析,各有利弊,读者可以结合自己的需求择优使用。应该说,在
ECMAScript
6之前并没有一种定义循环变量的完美解决方案。好在ECMAScript标准委员会也及时发现了这个问题,让我们一起期待let关键字吧。

作者:ralph_zhu

来源:51CTO

时间: 2025-01-31 09:29:50

Javascript中的循环变量声明,到底应该放在哪儿?的相关文章

javascript的for循环变量的初始化问题

问题描述 javascript的for循环变量的初始化问题 为什么声明的变量位置不一样得出的结果也不一样?在for循环外面和在for里面声明变量i 和j并初始化赋值0,结果不一样. <html> <head> <meta charset="utf-8"/> <title></title> <style type="text/css"> *{ padding:0; margin:0; font-s

java中为什么有的变量声明而不赋值?

问题描述 java中为什么有的变量声明而不赋值? java中为什么有的变量声明而不赋值?而有的就值,那什么情况下要赋值,什么情况下不赋值 解决方案 比如对象变量,而调用这个变量的构造函数非常耗费时间,所以我们等用到的时候再创建,如果程序运行完都不访问它,就根本不创建,这样可以提高效率. 对于简单变量,比如int float一类的,建议随手给一个初始值. 解决方案二: 你这个问题给你举个例子,你应该就能理解了 例如: int a; 这是只声明不赋值,则只会在内存的栈区创建引用,堆中并无此引用的指向

JavaScript中for循环的使用详解

  这篇文章主要介绍了JavaScript中for循环的使用详解,是JS入门学习中的基础知识,需要的朋友可以参考下 我们已经看到,while循环有不同变种.本章将介绍另一种流行的循环叫做for循环. for 循环 for循环是循环最紧凑的形式,并包含有以下三个重要部分组成: 循环初始化计数器的初始值.初始化语句执行循环开始之前. 测试语句,将测试如果给定的条件是真还是假.如果条件为真,那么将要执行的循环中给定的代码,否则循环会退出来. 循环语句,可以增加或减少计数器. 可以把所有的三个部分中的一

JavaScript中对循环语句的优化技巧深入探讨_javascript技巧

循环是所有编程语言中最为重要的机制之一,几乎任何拥有实际意义的计算机程序(排序.查询等)都里不开循环. 而循环也正是程序优化中非常让人头疼的一环,我们往往需要不断去优化程序的复杂度,却因循环而纠结在时间复杂度和空间复杂度之间的抉择. 在 javascript 中,有3种原生循环,for () {}, while () {}和do {} while (),其中最为常用的要数for () {}. 然而for正是 javascript 工程师们在优化程序时最容易忽略的一种循环. 我们先来回顾一下for

JavaScript中for循环 while循环 do while循环例子

不同类型的循环 JavaScript 支持不同类型的循环: for - 循环代码块一定的次数 for/in - 循环遍历对象的属性 while - 当指定的条件为 true 时循环指定的代码块 do/while - 同样当指定的条件为 true 时循环指定的代码块 For 循环 for 循环是您在希望创建循环时常会用到的工具. 下面是 for 循环的语法: for (语句 1; 语句 2; 语句 3)    {    //被执行的代码块    }  语句 1 在循环(代码块)开始前执行 语句 2

javascript中for循环有几种不同的使用情况介绍

 for循环是多数语言都有的.在javascript中,for循环有几种不同的使用情况,下面为大家一一介绍下 程序实现中经常要用到循环语句,其中for循环是多数语言都有的.在javascript中,for循环有几种不同的使用情况,下面就分别来讲述我的理解.    第一种:(通常情况,循环执行相关操作)   代码如下: var objA=document.getElementsByTagName("a");  var i,max;  for(i=0,max=objA.length;i&l

javascript中的循环语句for语句深入理解_javascript技巧

程序实现中经常要用到循环语句,其中for循环是多数语言都有的.在javascript中,for循环有几种不同的使用情况,下面就分别来讲述我的理解. 第一种:(通常情况,循环执行相关操作) 复制代码 代码如下: var objA=document.getElementsByTagName("a"); var i,max; for(i=0,max=objA.length;i<max;i++){ objA[i].onclick=function(){ alert(this.innerH

深入理解Javascript中的循环优化_javascript技巧

循环是大多数编程语言都具备的基本功能,JS也不例外,不同之处在于JS是解释型语言,运行于浏览器环境中,客户端的软硬件条件会对JS执行效率产生很大的影响.然而客户端环境对于开发者是未知.多样的,并且难以改变,所以优化代码质量是提高代码效率的主要途径.JS代码中,循环是比较容易导致性能问题的因素.理解循环特性进而有针对性地进行优化也许会带来不错的性能提升.for.while.do-while循环:这三种循环本身的循环效率相差不多,所以只要根据适合的应用场景选择即可.以for循环为例: 复制代码 代码

JavaScript中for循环的使用详解_基础知识

 我们已经看到,while循环有不同变种.本章将介绍另一种流行的循环叫做for循环. for 循环 for循环是循环最紧凑的形式,并包含有以下三个重要部分组成:     循环初始化计数器的初始值.初始化语句执行循环开始之前.     测试语句,将测试如果给定的条件是真还是假.如果条件为真,那么将要执行的循环中给定的代码,否则循环会退出来.     循环语句,可以增加或减少计数器. 可以把所有的三个部分中的一行用分号隔开. 语法 for (initialization; test conditio