首页 > 试题广场 >

下面一段JavaScript代码的运行结果是

[单选题]
下面一段JavaScript代码的运行结果是
var a,b;
(function(){
    alert(a);
    alert(b);
    var a=b=3;
    alert(a);
    alert(b);
})();
alert(a);
alert(b);
  • undefined,undefined,3,3,undefined,3
  • undefined,undefined,3,3,undefined,undefined
  • 0,0,3,3,undefined,undefined
  • undefined,undefined,3,3,0,0
A  var a=b=3 时a是局部变量,而b是全局变量
发表于 2015-06-09 19:52:34 回复(20)
var a=b=3 时a是局部变量,而b是全局变量
发表于 2021-12-13 10:53:48 回复(0)
请问下各位大神,怎么我在chrome控制台上运行结果输出的结果是undefined,3,3,3,undefined,3
发表于 2017-07-07 19:13:55 回复(1)
var a=b=3 相当于 var a = 3;b = 3;b是全局的
发表于 2015-07-25 15:31:20 回复(10)
经过测试,是这样执行的
var a,b;
(function(){
    alert(a); //这是第一个输出的,先在局部没找到a变量,然后去全局找,找到了但没定义,输出undefined
    alert(b);    //这是第二个输出的,其他同上
    var a=b=3;    //定义一个局部变量a=3,然后给全局变量b赋值 b=3;
    alert(a);     //这是第三个输出,局部变量a=3
    alert(b);     //这是第四个输出,全局变量b=3
})();            //这个函数体已经执行完毕,里面的内存已经被垃圾回收器回收,局部变量a销毁
alert(a);        //这是第五个输出,全局变量a=undefined
alert(b);        //这是第六个输出,全局变量b=3
故正确答案是undefined,undefined,3,3,undefined,3;选A

发表于 2018-03-03 13:56:05 回复(11)
A ,这段代码其实等价于
var a,b;  //undefined (function(){
    var a;   //undefined alert(a);  //undefined alert(b);  //undefined b=3;       //3
    a = b;     //3
    alert(a);  //3
    alert(b);  //3
})();
alert(a);   //undefined alert(b);   //3

变量的作用域问题。
细心点就不会选错了。
编辑于 2015-04-22 19:21:47 回复(3)
唉,太坑了,因为b没有var,所以是全局变量
发表于 2016-11-25 10:40:29 回复(2)
首先是变量提升(hoisting),其次是理解"a=b=3",这句相当于"b=3;var a=b;"
发表于 2015-09-25 16:45:34 回复(1)
(1)最一开始的时候执行最后两行的alert,因为整体执行完后自执行匿名函数才会执行,此时a,b均被声明了,但是没有被赋值,所以为undefined;(2)在匿名函数内部,var a=b=3 会变量提升,所以结果都是3;(3)a是局部变量,b是全局变量,局部变量使用完后会被销毁。所以a的作用域只有alert(a)这一句,而b全局变量不会被销毁。
发表于 2016-05-25 22:37:09 回复(10)
最开始执行匿名函数,定义了a, b,然后执行了匿名函数,这时候由于还未赋值,所以a 和 b都是undefined,接着var a = b = 3, 等价于var a ,b = 3,a = b,这里的a是局部变量,b是全局变量,所以alert值为 3 ,3 ,接着执行完匿名函数,alert(a),这里的a是全局变量,还是undefined,而b在匿名中已经赋值3,所以是3。 最后输出 undefined undefined 3 3 undefined 3
发表于 2018-04-10 10:08:01 回复(0)
var a=b=3;等价于b=3;var a=b;
发表于 2015-04-09 19:46:26 回复(2)

考点:变量提升、作用域、闭包。

  • 执行(1),全局作用域内定义a,b。

  • 闭包,执行(5),var a = b = 3等价于b = 3; var a = b; 变量提升在闭包函数作用域内定义a。

  • 执行(3),函数作用域内a = undefined;

  • 执行(4),b为全局变量,b = undefined;

  • 执行(5),b = 3; a = b; 此时a, b被赋值。a为函数内变量, b为全局变量。

  • 执行(6),a = 3;

  • 执行(7),b = 3;

  • 执行(9),此时的a为全局变量, a = undefined>

  • 执行(10),在第(5)步中,b被赋值为3。

变式

把第一行改为var a = 2, b = 5;

输出undefined, 5, 3, 3, 2, 3

发表于 2017-08-14 12:22:53 回复(1)
无声明的变量直到被赋值时才被隐式地创建为全局变量,在函数体内只有a声明被提升,b在赋值时成了全局变量,故外部输出b为3
发表于 2021-12-14 20:04:57 回复(0)
很简单,当运行到IIFE的时候,var a=b=3,实际上这条语句被变量提升的只有 a,而b属于全局的b,并不属于该IIFE内声明的变量。
总结:b属于全局变量。并不是在IIFE里面声明的变量。
发表于 2019-04-26 21:54:20 回复(0)
var a=b=3;  赋值是从右向左进行的,也就是说这一行先执行b=3;  这时候b就成为了全局变量,没有被var。  然后是 var a=b;  a被声明了,是局部变量。
发表于 2018-11-19 11:06:01 回复(0)
var a=b=3;   
相当于:var a=3;  b=3;
a是局部变量,b是全局变量
发表于 2017-03-03 17:47:24 回复(0)
b为3的意思是闭包里面的b并非是新定义的,而是在外面定义的
发表于 2017-01-16 08:33:19 回复(0)
对于var a=b=3的解析是:
b=3;
var a=b;
整个执行过程即为:
var a,b;
(function(){
    var a;//变声声明提前
    alert(a);//undifined
    alert(b);//undifined
    b=3;//function内部没有定义b,所以此处的b是全局变量
    a=b;
    alert(a);//3
    alert(b);//3
})();
alert(a);//undefined
alert(b);//3

发表于 2019-08-08 20:57:11 回复(0)
var a=b=3-->var a=3;b=3
发表于 2016-10-11 14:37:14 回复(0)
var a = b=3 实际上就是var a = 3 b=3此时a是立即执行函数里的局部变量,而b则是修改了全局里b的值,b从undefined变为了3
发表于 2022-08-20 07:06:24 回复(0)