2014-12-06 202 views
12

在下面的代码中,我预计ab都是3。但是,aundefinedb3。为什么?为什么a在var a = b = 3时b是3时未定义?

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

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

似乎并没有表现在这[小提琴]这种方式(http://jsfiddle.net/cgskkut9/) – 2014-12-06 07:37:15

+0

它的工作原理代码,我在头部和身体都用铬进行了检查。 – 2014-12-06 07:38:06

+0

@HoboSapiens:那是因为你没有把相关的代码放到你的小提琴中...尝试http://jsfiddle.net/cgskkut9/1/ – Chris 2014-12-06 19:52:49

回答

37

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

var b = 3; 
var a = b; 

但事实上,VAR A = B = 3;实际上是简写:

b = 3; 
var a = b; 

因此,B结束是一个全局变量(因为它不被var关键字之后)并且仍然在范围外连封闭函数的。

的原因是不确定的是,一个是局部变量,自我执行的匿名函数

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

你说得对。我删除了严格使用说明。 – user2466202 2014-12-06 22:59:13

7
var a=b=3 

是一样的:

var a = (b = 3) 

而且var声明仅适用到a,而不是b。您可以检查var语句here的语法。

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

5

a IS 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是一个局部变量。

外anounymous功能,b是访问,但a根本不存在,因为在全球范围没有定义。

4

我在下面的风格写道:

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

所以在你的情况下a是无法识别的,因为它是不是在全球范围内。但是b被视为全局。 var用于声明局部变量。

0

比较之下

'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 
+0

downvote的原因是什么?答案是事实。 http://jsfiddle.net/9h9jqts8/ – tsuz 2015-01-03 08:48:43

相关问题