2014-12-06 70 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