firefox對條件判斷語句塊內的函式宣告的處理

2022-05-27 04:09:11 字數 1127 閱讀 1188

今天在做乙個小練習的時候,發現乙個問題,firefox輸出的結果跟其他瀏覽器不一樣,甚至還報錯。

廢話少說,直接上碼:

1 (function()else

7 }

8 })();

這個一開始我猜測的是輸出b,結果都是a,除了ff的報錯

首先來看ff為什麼會報錯,這個理解了也就理解了為什麼會輸出a而不是b。

在w3chelp上面這樣解釋的:「根據 ecmascript 規範第 13 章 function definition 和第 14 章 program 中的描述,函式宣告只能出現在 program(程式,即全域性環境)或函式體內。

換句話說,函式宣告不能出現在塊( 如 if、while 或 for 語句)中」。

並解釋問題的原因:firefox 的 tracemonkey 引擎對函式宣告的處理與 ecmascript 規範的要求不符,tracemonkey 將塊中的函式宣告作為「函式語句」來處理。而其他瀏覽器的引擎仍將這類塊中的函式宣告當作該塊之外的函式宣告來解析。那這麼說來,按照規範而言,ff裡面報錯是對的咯,反倒是其他瀏覽器能夠執行是不對的啦,因為他們有悖於ecma規範。

那麼要怎樣做既能避免ff報錯,又能符合規範,還達到相容瀏覽器的效果呢?

w3help中也給出了對應的解決方案:就是用函式表示式代替函式宣告。即把上面的**改寫如下:

1  (function()else

9 })();

這樣所有瀏覽器輸出結果都是b,ff也不報錯了。

至於為什麼這次輸出是b而不是a,上次為什麼是a,作個簡單解釋:

因為知道函式定義有兩種方式:函式宣告和函式表示式,兩者的區別也就是這裡結果不同的原因。就是函式宣告會在其餘**執行前就先預處理,並存放到執行環境中的,所以當if(s),s就已經存在啦,這也就是為什麼第一次會輸出a。而函式表示式是乙個語句,根據js**執行順序,它是從上往下依次執行的,所以當執行到s = function(){alert('a');s才有值,一開始if(s),s是undefined,即false,所以不會執行s(),只會去執行else裡面的。這就是為什麼第二次會輸出b的原因。

參考資料:

if條件判斷語句

如果表示式的值是true,則執行語句塊 否則跳過語句塊。equals 下面的例子使用到的,可以看看。字串判斷不能使用 要使用方法。用來判斷記憶體位址是否相等。輸入男女,輸出boy,girl system.out.println 請輸入男or女 scanner sc new scanner syste...

條件判斷語句

語法 if condition else if condition else示例 var age 20 if age 18 else語法 表示式1 表示式2 表示式3 如果表示式1的布林值為true,則執行表示式2,否則執行表示式3。是js語言中唯一乙個需要三個運算元的運算子。示例 var age ...

條件判斷語句

條件判斷語句 使用條件判斷語句可以在執行某個語句之前進行判斷,如果條件成立才會執行語句,條件不成立則語句不執行。if語句 語法一 if 條件表示式 if語句在執行時,會先對條件表示式進行求值判斷,如果條件表示式的值為true,則執行if後的語句,如果條件表示式的值為false,則不會執行if後的語句...