在以下代码中,我预计a
和b
都是3
。但是,a
为undefined
,b
为3
。为什么呢?
(function(){
var a = b = 3;
})();
console.log(typeof a);//"undefined"
console.log(b);//3
答案 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
将在全局范围内定义。内部函数a
和b
都是3,但在函数返回后,注册的局部变量(a
)被删除。由于b
在全局范围内定义,因此不会删除。
答案 2 :(得分:5)
a
确实是3,但它属于无法解释的范围。
此行var a = b = 3
实际上是:
b = 3
,而b
被声明为全局变量。
明确赋值b=3
的返回值是,是,指定值3
。
var a = the return value of previous expression
,因此等于var a = 3
,但这次a
是一个局部变量。
在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