为什么a未定义而b在var a = b = 3时为3?

时间:2014-12-06 07:33:08

标签: javascript

在以下代码中,我预计ab都是3。但是,aundefinedb3。为什么呢?

(function(){
    var a = b = 3;
})();

console.log(typeof a);//"undefined"
console.log(b);//3

5 个答案:

答案 0 :(得分:39)

这里的问题是,大多数开发人员都认为语句var a = b = 3;是简写:

var b = 3;
var a = b;

但事实上,var a = b = 3;实际上是简写:

b = 3;
var a = b;

因此,b最终成为一个全局变量(因为它前面没有var关键字),并且即使在封闭函数之外仍然在范围内。

a未定义的原因是a是该自执行匿名函数的局部变量

(function(){
    var a = b = 3;
})();

答案 1 :(得分:7)

var a=b=3 

与:

相同
var a = (b = 3) 

var语句仅适用于a,而不适用于b。您可以查看var声明here的语法。

因此a将在本地范围内定义,b将在全局范围内定义。内部函数ab都是3,但在函数返回后,注册的局部变量(a)被删除。由于b在全局范围内定义,因此不会删除。

答案 2 :(得分:5)

a确实是3,但它属于无法解释的范围。

此行var a = b = 3实际上是:

  1. b = 3,而b被声明为全局变量。

  2. 明确赋值b=3的返回值是,是,指定值3

  3. var a = the return value of previous expression,因此等于var a = 3,但这次a是一个局部变量。

  4. 在anounymous函数之外,b可以访问,但a甚至不存在,因为全局范围中没有定义。

答案 3 :(得分:4)

我用以下风格写道:

console.log(typeof b);//"number"
console.log(a);// error with a is not defined

因此,如果您的a无法识别,因为它不在全球范围内。但b被视为全局。 var用于声明局部变量。

答案 4 :(得分:1)

比较以下代码

'use strict'
(function(){
    var a = b = 3; // ERROR. Prevents global variable name clash
})();

并且

(function(){
    var a = b = 3; // Silently assigns 3 to a global variable b
})();

console.log(typeof a);//"undefined"
console.log(b);// 3