Javascript 为什么在变量a=b=3中a是未定义的,而b是3?

Javascript 为什么在变量a=b=3中a是未定义的,而b是3?,javascript,Javascript,在下面的代码中,我希望a和b都是3。但是,a是未定义的,b是3。为什么? (function(){ var a = b = 3; })(); console.log(typeof a);//"undefined" console.log(b);//3 这里的问题是大多数开发人员理解语句var a=b=3是以下内容的简写: var b = 3; var a = b; b = 3; var a = b; 但事实上,VarA=b=3;实际上是以下的简写: var b = 3; var

在下面的代码中,我希望
a
b
都是
3
。但是,
a
未定义的
b
3
。为什么?

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

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

这里的问题是大多数开发人员理解语句
var a=b=3是以下内容的简写:

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

var b = 3;
var a = b;
b = 3;
var a = b;
因此,b最终是一个全局变量(因为它前面没有var关键字),即使在封闭函数之外,它仍然在作用域中

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

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

var a = (b = 3) 
var
语句只适用于
a
,而不适用于
b
。您可以检查
var
语句的语法


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

a
确实是3,但它在异常功能的范围内

这一行实际上是:

  • b=3
    ,而
    b
    被声明为全局变量

  • 赋值表达式
    b=3
    的返回值是赋值
    3

  • var a=前面表达式的返回值
    ,因此等于
    var a=3
    ,但这次
    a
    是一个局部变量


  • 在异常函数之外,
    b
    是可访问的,但是
    a
    甚至不存在,因为没有在全局范围中定义

    我以以下方式编写:

    console.log(typeof b);//"number"
    console.log(a);// error with a is not defined
    
    因此,对于您的
    a
    无法识别,因为它不在全局范围内。但是
    b
    被视为全局的
    var
    用于声明局部变量。

    比较下面的代码

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


    在这个问题上似乎不是这样的,它是有效的,我已经在头部和身体的铬合金中检查了它。@HoboSapiens:那是因为你没有把相关的代码放进你的小提琴里。。。试试@chris自从我发布那篇文章以来,这个问题已经被更新以澄清这个问题。-1:鉴于
    var
    声明了一个局部变量,这是一个非常奇怪的假设。你是对的。我删除了关于严格使用的注释。