人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

JavaScriptの質問です。
以下のコードを実行させると、
Firefoxでは「true」(2つ目はエラー)
Chromeでは「false」「true」
とアラートが出るのですが、これはどのような仕様の違いから生まれているのでしょうか?
参考になるページなどがあれば教えてください。



if(1){
function a(){
return true
}
}else{
function a(){
return false
}
}
while(0){
function b(){
return true
}
}
alert(a());
alert(b());

●質問者: Lhankor_Mhy
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● Cherenkov
●300ポイント ベストアンサー

注: SpiderMonkey 以外の JavaScript エンジンの中には、名前の付いた関数式を全て関数宣言と間違ってみなすものがあります。これによって常に偽となる条件式の中にあっても zero が定義されてしまいます。

関数 - MDN

IE9,Chrome14,Safari5,Opera11 vs Firefox7




<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<p><a href="http://q.hatena.ne.jp/1318587775">http://q.hatena.ne.jp/1318587775</a></p>
<script>
if(1){
  a = function a(){
    return 'a1'
  }
}else{
  a = function a(){
    return 'a2'
  }
}
while(0){
  b = function b(){
    return 'b'
  }
}
alert(a());
alert(b());
</script>
</body>
</html>
◎質問者からの返答

おお、なるほどよく分かりました。

「ソース要素」とかなんか怪しげな定義だな、と思いましたが、ECMAscript仕様日本語訳見てきましたが、そのとおりなんですね。たしかに関数定義のためにブロックの中を処理してない。

ECMAscript準拠という意味では、Firefoxの動作が正しくて他のブラウザが間違ってるんですね。

とても勉強になりました、ありがとうございます。

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ