2011-10-05 94 views
1

的JSON對象作爲測試的問題,以確保調用JSON對象在IE不會失敗我最近添加到了我的JS庫:在舊版本的IE

//Works 
//if(!JSON) var JSON={}; 
//JSON.stringify = JSON.stringify || function(){}; 
//Works 
//if(!window.JSON) JSON={}; 
//JSON.stringify = JSON.stringify || function(){}; 
//Does not work 
//if(!JSON) JSON={}; 
//JSON.stringify = JSON.stringify || function(){}; 
//Best of both! 
if(!window.JSON) var JSON={}; 
JSON.stringify = JSON.stringify || function(){}; 

當我說「不起作用「我的意思是它不能在IE7中工作,並拋出」JSON等等等等等「錯誤。爲什麼指定window.JSON不會拋出錯誤?爲什麼不指定window.JSON,但使用var JSON不會引發錯誤?這只是愚蠢的IE的東西,我不應該擔心或是這種危險的結果,併成爲其他瀏覽器的問題?

注意「控制檯」也是如此。

+0

如果你閱讀錯誤,它會像'錯誤:'JSON'是未定義的',這可能導致你的答案。無論如何,chuckj釘牢它。 – RobG

回答

3

訪問未定義的全局變量將始終拋出。訪問對象的未定義屬性將始終返回undefined。窗口是全局別名的事實不會改變這裏的規則,訪問一個未定義的窗口成員將返回undefined

至於爲什麼第二個示例不拋出是因爲所有的var都被提升到封閉範圍,無論它們出現在哪裏,並且在該範圍內執行任何代碼之前。這意味着即使var未執行,也會定義JSON變量,但它只包含undefinedvar做了兩件事,在範圍內創建一個變量,並且可選地初始化該變量。創建變量被提升到作用域的頂部,並將其賦值到出現的位置。所有變量都包含undefined,直到它們被分配一個值。如果分配未執行,它們將保持undefined。重複的var在同一範圍內被忽略。這意味着如果JSON已經在範圍內,則var將被忽略。

這不是愚蠢的IE東西,所有符合JavaScript實現的ES5都需要遵循上面列出的規則。

+0

+1。儘管所有的變量都應該被聲明,但有時候這種事情是無法控制的。訪問可能未定義或聲明的變量的安全方法是使用'typeof'。 – RobG

+0

吸收這個答案需要一段時間,但它看起來很有希望!我一直在想,爲什麼沒有Chrome或FF扔,但這是因爲控制檯和JSON * ARE *爲這些瀏覽器定義。 – tooshel