在下面的代碼中,我預計a
和b
都是3
。但是,a
是undefined
和b
是3
。爲什麼?爲什麼a在var a = b = 3時b是3時未定義?
(function(){
var a = b = 3;
})();
console.log(typeof a);//"undefined"
console.log(b);//3
在下面的代碼中,我預計a
和b
都是3
。但是,a
是undefined
和b
是3
。爲什麼?爲什麼a在var a = b = 3時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;
但事實上,VAR A = B = 3;實際上是簡寫:
b = 3;
var a = b;
因此,B結束是一個全局變量(因爲它不被var關鍵字之後)並且仍然在範圍外連封閉函數的。
的原因是不確定的是,一個是局部變量,自我執行的匿名函數
(function(){
var a = b = 3;
})();
你說得對。我刪除了嚴格使用說明。 – user2466202 2014-12-06 22:59:13
var a=b=3
是一樣的:
var a = (b = 3)
而且var
聲明僅適用到a
,而不是b
。您可以檢查var
語句here的語法。
因此a
將在本地範圍內定義,b
將在全局範圍內定義。內函數a
和b
都是3,但函數返回後註冊的局部變量(a
)被刪除。由於b
在全局範圍內定義,因此不會被刪除。
a
IS 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
根本不存在,因爲在全球範圍沒有定義。
我在下面的風格寫道:
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
})();
而且
(function(){
var a = b = 3; // Silently assigns 3 to a global variable b
})();
console.log(typeof a);//"undefined"
console.log(b);// 3
downvote的原因是什麼?答案是事實。 http://jsfiddle.net/9h9jqts8/ – tsuz 2015-01-03 08:48:43
似乎並沒有表現在這[小提琴]這種方式(http://jsfiddle.net/cgskkut9/) – 2014-12-06 07:37:15
它的工作原理代碼,我在頭部和身體都用鉻進行了檢查。 – 2014-12-06 07:38:06
@HoboSapiens:那是因爲你沒有把相關的代碼放到你的小提琴中...嘗試http://jsfiddle.net/cgskkut9/1/ – Chris 2014-12-06 19:52:49