JS变量定义时连续赋值的坑!

在定义变量时,可以将值相同的变量采用连续赋值的方式,如下代码:

var a = b = c = ‘‘;

其实这里面有一个很大很大的坑,以代码说明问题:

<script language="javascript">
    function test(){
        var i = 0;
        _test();

        function _test(){
            if(++i>2) return;

            var a = b = ‘‘; // 这里连续赋值
            for(var j=0; j<=2; j++){
                b = ‘a‘ + b;
                 _test();
            }
              console.log(‘b:‘+b);
        }
    }
    test();
</script>
<script language="javascript">
    function test(){
        var i = 0;
        _test();

        function _test(){
            if(++i>2) return;

            var a = b = ‘‘; // 这里连续赋值
            for(var j=0; j<=2; j++){
                b = ‘a‘ + b;
                 _test();
            }
              console.log(‘b:‘+b);
        }
    }
    test();
</script>

上例中返回的结果为:

b:aaa
b:aaaaa

与我想像中的结果不一定,我想要的结果是:

b:aaa
b:aaa

所以,去掉连续赋值,改成逐个赋值,结果就正确了,代码如下:

<script language="javascript">
    function test(){
        var i = 0;
        _test();

        function _test(){
            if(++i>2) return;

            var a =‘‘,  b = ‘‘; // 这里逐个赋值
            for(var j=0; j<=2; j++){
                b = ‘a‘ + b;
                 _test();
            }
              console.log(‘b:‘+b);
        }
    }
    test();
</script>

说重点:建议不要连续赋值!

原文地址:https://www.cnblogs.com/wm218/p/9977070.html

时间: 2024-08-04 04:58:34

JS变量定义时连续赋值的坑!的相关文章

Js变量定义——fn里 var与不var的区别

js运行时内置了一个Global对象. 这个Global对象跟运行环境有关.在浏览器运行环境中.Global就是window对象.在nodejs中.Global对象是global对象. 当你在浏览器环境中,直接使用一个未经定义的变量,例如foo=123;那么foo这个变量自动声明为全局变量.变量引用自动挂载到了Global对象,即window对象上,使用上等同于全局对象的属性,你可以试试来验证. 如: <!DOCTYPE html> <html lang="en"&g

访问进程环境变量environ时的一个坑

在unistd.h中定义了变量char **environ;来表示当前所有环境变量,一般来说访问特定环境变量可以用getenv,但是想遍历所有环境变量就得使用environ. 即在程序内全局声明extern char **environ;当然设定main函数第3个参数也可以,不过不推荐,因为ISO C的main函数没有第三个参数. environ维护了一个char*数组,每个元素都是一个指针指向函数栈帧顶部的环境变量,数组结尾是NULL. 于是正确的遍历姿势是下面这样 for (int i =

js变量提升的一个小坑

好久没写博客了,原本想实训结束能对整个实训项目认真总结一下,没想到回到学校一点都不轻松,最近在制作网页版简历,遇到了一个小问题,现在不总结以后肯定忙得顾不上,所以长话短说,抓紧时间写下来. 对js语法比较熟的同学可能都知道:js是没有块级作用域的,有一个新手很容易出错的地方 for(var i = 0 ; i < 10 ; i ++){ setTimeout(function(){ console.log(i) },1000*i) } 这段代码会输出10个10,而不是期望的1,2,...,10,

Effective C++:条款26:尽可能延后变量定义式的出现时间

(一) 那么当程序的控制流到达这个变量定义时,变承受构造成本:当变量离开作用域时,便承受析构成本. string encryptPassword(const std::string& password) { using namespace std; string encrypted; if(password.length() < MinimumPasswordLengt) { throw logic_error("Password is too short") } -//

转载-定义时初始化和构造器初始化的差异

概述 在Java中使用一个变量时,如果我们不给变量初始化,则编译器会自动给变量初始化赋值,使得所有的变量在使用前都能得到恰当的初始化. 对于方法中的局部变量,如果不初始化就使用,则会报错(类似"The local variable i may not have been initialized"的错误信息). 举例 Dog类代码如下: public class Dog implements Serializable { private static final long serialV

C语言变量定义与数据溢出(初学者)

1.变量定义的一般形式为:类型说明符.变量名标识符等:例:int a,b,c;(abc为整型变量) 在书写变量定义时应注意以下几点: (1)允许在一个类型说明符后,定义多个相同类型的变量.各变量之间用","间隔.类型说明符与变量名之间用一个空格间隔. (2)最后一个变量之后必须以":"结尾. (3)变量定义必须放在变量使用之前,一般放在函数体的开头部分. 注:有符号整型遇无符号整型会统一变为有符号整型. 2.整型数据的溢出: #include <stdio.h

第二章 Shell变量定义

1. Shell变量概述 1. 什么是变量 变量是Shell传递数据的一种方法,简单理解:用一个固定的字符串去表示不固定的内容,便于后续引用. 2.变量命令规范 变量定义时名称有要求:字母.数字.下划线几个组成,尽量字母开头,变量名最好具备一定的含义. ip=10.0.0.100 ip1=10.0.0.100 Hostname_Ip=10.0.0.100 hostname_IP=10.0.0.100 等号是赋值,需要注意:等号两边不能有空格,其次定义的变量不要与系统命令出现冲突. 3. Shel

JS 多种变量定义

对象直接量创建一个对象:  var obj = {x:[1,2],y:23}; 代码跟下面是一样的.  var obj=new Object(); obj.x=new Array(1,2); obj.y=23; 一.什么是匿名函数 在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);}函数字面量(Function Literals): var fnMethodName = functio

js面向对象编程: js类定义函数时prototype和this区别?

在面向对象编写js脚本时,定义实例方法主要有两种 如下: function ListCommon2(afirst) { var first=afirst; this.do1=function () { alert("first do"+first); } } ListCommon2.prototype.do2=function() { // alert("first do"+first);//会出错,不能访问first this.do1(); } this.do1=