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
声明了一个局部变量,这是一个非常奇怪的假设。你是对的。我删除了关于严格使用的注释。