2012-07-25 83 views
3

我想知道在Javascript中括號內的工作,所以我寫了這個代碼進行測試:的Javascript奇StackOverflow的錯誤

((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
4+4 
)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) 

在其中包括:

(x1174 
4+4 
) x1174 

我上面測試的代碼Google Chrome 20(Win64),它給了我正確的答案(8)。

但如果我嘗試相同的代碼,但與1175個括號(兩側),我得到一個計算器錯誤。

您可以JSFiddle檢查這個代碼(注:它的jsfiddle停止隨1178個括號工作)

所以,我的問題是:

  • 它爲什麼會發生?
  • 爲什麼它停止與1178個括號上的jsfiddle但只有1175我的空白頁上工作?
  • 此錯誤取決於頁面/瀏覽器/操作系統?
+0

這是什麼測試?任何申請? – elclanrs 2012-07-25 00:36:34

+0

只是爲了好奇。沒有意義的應用 – 2012-07-25 00:39:57

+0

順便說一下,根據(ECMAScript)標準,沒有限制(因爲[* PrimaryExpression *](http://ecma-international.org/ecma-262/5.1/#sec-11.1)生產是遞歸)。 – 2012-07-25 00:41:14

回答

6

通常語言是通過沿着稱爲遞歸下降的模式設計的代碼解析的。我不確定這是否是這種情況,但肯定「堆棧溢出」錯誤是一大塊證據。

的想法是,解析表達式,你看什麼的表情可以接近的語法。 A 加上括號表達式就像是「表達式內的表達式」。因此,爲了讓解析器系統地解析代碼中的某些表達式(對於解析器來說,它是它的永恆命運),左括號意味着「好 - 保持你正在做的事情(在堆棧上),並從表達式可能的開始處開始並解析一個新的完整表達式,並在看到匹配的關係表達式時返回。

因此,一千以上括號的字符串觸發同一活動的等效串聯:把我們所擁有的架子上;潛入並得到一個子表達式,然後在我們知道它看起來像什麼時恢復。

現在這不是解析的時候,唯一的方法,但應注意。有很多方法。我個人非常喜歡遞歸下降解析,但是沒有什麼特別的(除了我認爲有一天會導致我看到一個真正的獨角獸)。

+0

資料':)' – 2012-07-25 01:05:48

+1

讓我們貼在獨角獸上。 – Malvolio 2012-07-25 01:46:46

5

的行爲在不同的瀏覽器不同,因爲他們擁有的Javascript不同的實現。該語言沒有指定這樣的事情應該如何失敗,所以每個實現以不同的方式失敗。

的jsfiddle和空白頁之間的差別是因爲本身的jsfiddle使用一些堆棧幀建立在其上運行代碼的環境。

+0

但爲什麼parens會增加堆棧大小?我認爲只有函數調用才能做到這一點... – 2012-07-25 00:48:30

+0

誰知道如何編寫解釋器?你可能不是在談論Javascript堆棧,而是C堆棧。語言實現的內部可以比你想象的更加巴洛克式。 – 2012-07-25 00:50:56

+1

@ŠimeVidas看到我的回答:-)這是導致問題的表達式的**解析**,而不是評估。 – Pointy 2012-07-25 00:51:35