首页 > 试题广场 >

上面这段代码运行后的输出是:

[单选题]
(function() {
      var a = b = 5;
  })();   
console.log(b);
console.log(a);
上面这段代码运行后的输出是:
  • 5,5
  • undefined,undefined
  • 5,undefined
  • 5,Uncaught ReferenceError: a is not defined
第一个考点在于var a=b=5相当于拆解成var a=b; b=5; 然后,b=5前面没有var,相当于声明为全局变量(这种方式在严格模式下会报错,此题不考虑)。所以就相当于: var b; (fun…{ var a=b; b=5; })(); console.log(b); //5 console.log(a); //报错 此处报错也就是另一个考点,a声明的是函数的局部变量,在函数结束是就销毁了,所以在全局下找不到a,于是报错。 (手机码字,排版如果出错,请原谅⁄(⁄ ⁄ ⁄ω⁄ ⁄ ⁄)⁄)
发表于 2017-08-11 10:54:07 回复(20)
亲测,答案为D   ReferenceError: a is not defined
发表于 2017-05-11 09:25:09 回复(0)
1.var操作符
使用var操作符定义的变量将成为该变量的作用域中的局部变量,如果在函数中使用var定义一个变量,那么这个变量在函数退出后就会被销毁;
省略var操作符会创建一个全局变量,但在局部作用域中定义的全局变量很难维护,也会由于相应变量不会马上就有定义而导致不必要的混乱,给未经声明的变量赋值在严格模式下会导致抛出Reference错误,所以不推荐使用。
function noVar(){
message="global var";//全局变量
}
noVar();
console.log(message);
2.解析
var a=b=1;>> var a=b;b=1;
首先使用var初始化变量a赋值为b,b未定义,a=undefined;省略var初始化变量b为全局变量,b=1。
编辑于 2016-05-04 09:04:51 回复(6)
var=a=b=5;其中var a表示a为当前作用域的全局变量,b=5并没有定义为当前作用域的全局变量,它会申明提前在全局作用域中。
可表示如下:
var b=5;
(function() {
      var a = b ;
  })();
发表于 2016-04-29 10:23:38 回复(9)
明明会出错,a is not defined
发表于 2016-08-24 18:55:46 回复(12)
b为5毫无疑问,a是局部变量,在全局输出a,所以a是未声明,a报错,报错的话就没有值了,undefined是声明了未定义的变量的值
发表于 2016-06-10 11:38:10 回复(1)
(1)使用 var操作符 定义的变量将成为该作用域中的局部变量;
(2)省略 var操作符 会创建一个全局变量,但在局部作用域中定义的全局变量很难维护,也会由于相应变量不会马上就有定义而导致不必要的混乱,给未经声明的变量赋值在严格模式下会导致抛出Reference错误,所以不推荐使用。
                                   var a=b=5;
相当于                        b=5;
                                  var a=b;

另外扩展个全局变量的问题:
function foo(){
a=1;
}
console.log(a);      // Uncaught ReferenceError: a is not defined

function foo(){
a=1;
}
foo();
console.log(a);                      //1
发表于 2017-08-22 14:35:23 回复(0)
a没有在全局声明,所以后面会报错
发表于 2016-05-14 11:15:33 回复(1)
1)非严格模式下, 变量也可以不用var let const来声明, 例如 b=5 就相当于window.b = 5; 此时b 是全局变量。
2)严格模式下 ‘use strict’, 变量必须要用var let 或者const来声明,不然就会报错:b is not defined

本题中  var a=b=5 时,b是全局变量,故函数外能访问到b。
而a是函数内的变量也就是局部变量,在函数外是无法访问到的,故报错:a is not defined
发表于 2021-12-20 15:26:20 回复(0)
    (function() {
          var a = b = 5;
      })();   
    变为
(function() {
      var a = b ;b= 5;
  })(); 
最后为
var b=5;
(function() {
      var a = b;
  })();   
而这里a因为是在函数内,所以函数运行后会自动销毁变量a;
-----------------------------------
相当于等价于一下代码:
var b=5;
console.log(b);//5
console.log(a);//此时的a是没有被声明的,所以结果为 Uncaught ReferenceError: a is not defined

  
编辑于 2017-09-04 21:19:57 回复(0)
这一题的陷阱是,在函数表达式中有两个赋值,但a是用关键字var 来声明的,这意味着a是局部变量,而b则被赋予为全局变量。

另一个陷阱是,它并没有使用严格模式(use strict)。在函数里面,如果启用了严格模式,代码就会报错:“Uncaught ReferenceError: b is not defined”。请记住,严格模式需要你显式地引用全局作用域,代码应该写成:

编辑于 2017-04-17 16:27:37 回复(0)
①赋值运算是把左边的值给右边,所以这个连续的赋值运算符表达式,是从右往左。
②然后b = 5  ;var  a = b;
③自执行函数,局部作用域
发表于 2017-03-22 00:35:58 回复(0)
var a = b = 5 即 var a=5;b=5;函数环境中不带var默认为全局变量
发表于 2016-09-28 20:28:14 回复(0)
在函数内不定义就使用(b)为全局变量,定义了就为局部变量(a)。所以外面可以当问到全局b,而a做为局部变量已经被销毁,外面访问不到。上一题的扩展笔记:立即执行函数没有函数提升,执行完被销毁
发表于 2022-04-14 15:13:27 回复(0)
立即执行函数,是执行一次就立即销毁了
发表于 2021-11-01 15:10:51 回复(0)
(function() {
    var a = b = 5;
})();   
console.log(b);
console.log(a);
// 5
// Uncaught ReferenceError: a is not defined

// 等价于
var b;
// 全局作用域 global scope
(function() {
    // 变量提升 & function 作用域
    // hoisting & local scope
    var a;
    a = b;
    b = 5;
})(); 
// b, 可以访问到,且被赋值为 5
// a, IIFE 中定义的变量,外部访问不到,抛出引用错误
var x;
// 默认返回值 undefined
x
// undefined,如果没有给变量赋值,则为其赋值为默认值 undefined

var y = null;
// 默认返回值 undefined
y
// null,表示给变量赋值为空值 null

x == y
// true,值的意义都是都是空值
x === y
// false,值的意义相等,但是基本数据类型不同 (undefined, null)

x == false;
// false,值的意义不同,基本数据类型也不同
y == false;
// false,值的意义不同,基本数据类型也不同
z = `z`;
// "z"
z;
// "z"
编辑于 2020-08-15 10:23:10 回复(1)
var a = b = 5的意思是var a =5,b = 5,这个时候a是函数内的局部变量,外面访问不到,而b是作为全局属性(其实并不是全局变量),可以被外面访问到
发表于 2020-06-07 10:02:45 回复(0)
自执行函数,构成了块级作用于,里面的代码相当于
var a;
a=b;
b=5; //隐式声明
所以在外边,找不到a这个对象
发表于 2018-11-29 14:21:40 回复(0)
var a = b = 5;  首先使用var初始化变量a赋值为b,b未定义,a=undefined;省略var初始化变量b为全局变量,b=5。
发表于 2017-03-18 16:03:45 回复(0)
匿名函数中的a是局部变量,在函数结束后会被销毁,所以全局中的a是未定义的,不存在的,并不是声明了但未赋值的情况,所以应该会报错
发表于 2016-08-10 16:02:55 回复(0)