2013-03-14 100 views
4

心中已經試圖尋找使用cocos2d的JavaScript庫例如在this地方這行代碼什麼是「var cc = cc = cc || {};」在Cocos2D中做什麼?

var cc = cc = cc || {}; 

的原因,但我找不到任何合理的理由。根據設置的單一任務默認值可以,但雙重任務?任何人都知道這個的原因?

+6

看起來像一個錯誤,我 – musefan 2013-03-14 09:24:04

+0

是的,這絕對是一個錯誤。 – 2013-03-14 09:31:42

+1

也許它被評估爲'var cc =(cc = cc || {});',所以它只是設置本地和全局'cc'變量? – VisioN 2013-03-14 09:34:56

回答

1

這一個一直讓我煩惱,所以我有一個遊戲,並做了一些測試,這裏是我的發現。

我會告訴兩段不同的腳本,產生兩種不同的結果,從而解釋了爲什麼有人可以使用一個比其他。然而,使用的原因取決於編碼器,並且將基於它們想要發生的效果。

請注意,例如,我將使用實際值而不是空對象。

通常情況下,你可能會看到使用下面的例子:

var cc = cc || 1; 

這將創建一個名爲cc新的變量,並給出了一個現有的(同一範圍內)變量的任意值,或默認值爲1。這種方法不會改變原來的變量,儘管在實踐中它會看起來有改變的效果,因爲你不能隨後引用原始的變量,因爲它具有相同的名稱。

這可以通過使用不同的變量名,例如進行測試:

var aa; 
alert(aa); 
var cc = aa || 1; 
alert(aa); 
alert(cc); 

Example) 在這裏你可以看到aa永遠不會改變。

接下來我們看一下代碼有問題:

var cc = cc = cc || 1; 

這實際上會改變原來的變量,並創建一個新的地方之一。同樣,在變量名稱相同的情況下看到效果並不容易。但是,如果我們做同樣的名稱更改爲上面,我們可以看到真正的效果:

var aa; 
alert(aa); 
var cc = aa = aa || 1; 
alert(aa); 
alert(cc); 

Example) 這個時候我們可以看到,aa不會得到改變。總之,你可能從來沒有真正看到使用某個變量(具有相同變量名稱)的任何效果,但是我很好奇如果可能在某個地方引用原始文件之前將會發生什麼效果分配,因此選擇哪一個實際上會起作用。我會看看我是否能找到一些能夠在行動中展示這一點的東西。

+0

好的,這是對我來說最好的代碼解釋,但它仍然保留着使用的原因。爲什麼有人用它? :) – Jagi 2013-03-15 09:21:26

2

的代碼是等效於以下語句:

var cc; 
cc = cc || {}; 
cc = cc; 

這顯然是錯誤的。

UPDATE。我做了這個話題進行更多的研究,這裏是一個有趣的事情:

當你使用var關鍵字它會在當前範圍內一個新的變量,除非它已經在當前範圍存在。基本上,此代碼:

var cc = 1; 
function test() { 
    var cc = cc || {}; 
    return cc; 
} 
test(); 

總是會產生{},不管什麼cc的初始值(在全球範圍內)是。尤其是這樣的代碼:

var cc = [expression]; 

等同於:

var cc; 
cc = [expression]; 

雖然var cc;創建新的變量只有cc不會在當前範圍存在。

UPDATE 2.什麼操作優先是令人困惑的,因爲在OP的代碼中兩個=符號實際上是不一樣的。第一個表示變量聲明,因爲之前有一個var關鍵字。第二個是一個任務。這就是爲什麼

var x = y = z; 

相當於

var x; 
y = z; 
x = z; 

(注意:var關鍵字僅適用於x),而

x = y = z; 

相當於

y = z; 
x = z; 

(請注意,操作y=z回報z,這其實並不重要,(這可能是y明顯),但值得注意的是)

結論:左側變量聲明總是自帶的評估之前,右側並將右側分配給左側。

+0

它不等於'cc = cc || {}; var cc = cc;' – musefan 2013-03-14 10:08:19

+0

@musefan我不是100%確定它是如何工作的,但似乎變量聲明優先於其他操作。這也證明應該避免這樣的結構。 – freakish 2013-03-14 10:54:33

+0

@musefan我已經更新了我的答案。 – freakish 2013-03-14 12:35:32

0

這段代碼顯然是一個錯誤。筆者想到的可能是將全局和內部範圍變量設置爲相同的值,但這種表達式總是失敗。它不僅不能設置外部變量,而且總是返回{}

該表達式失敗的原因是在賦值之前聲明的變量被設置爲undefined。由於這行代碼嘗試分配一個與自身名稱相同的變量,並且由於JavaScript先評估內部作用域變量,因此cc將始終在賦值時刻解析爲未定義的內部自我,這會取消邏輯評估並返回{}

另一種方式看到它在代碼:

var cc;     //cc is set to 'undefined' 

cc = cc || {};   //which becomes equivalent to: 

cc = undefined || {}; //which finally evaluates to: 

cc = {}