• 締切済み

script要素をまたいだ関数定義と実行

最近、javasriptを勉強しています。 わからない挙動があったので質問させてください。 htmlファイル内に、 <script type="text/javascript"> f(); function f(){ alert("hoge"); } </script> ↑これが動いて、 <script type="text/javascript"> f(); </script> <script type="text/javascript"> function f(){ alert("hoge"); } </script> ↑これが動かないのはどうしてなのでしょう? htmlの解析順序?の関係だと思うのですが、 詳しく解説しているページなどがあれば教えてください。

みんなの回答

  • think49
  • ベストアンサー率59% (285/482)
回答No.3

関数定義 (FunctionDeclaration) は実行コンテキストに入るときに実体化するので順序に依存しません。 http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/10_Execution_Contexts.html#section-10.1.3 <script type="text/javascript"> f(); // 実行される hoge(); // TypeError: undefined is not a function function f () { alert('hoge'); }; var hoge = function () { alert('hoge'); }; </script> 異なるscript要素間の挙動については ECMAScript の範囲を超えているので、HTML 4.01, HTML5 あたりを読む必要があると思います。 HTML 4.01 Specification (ja) http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/cover.html HTML5 (including next generation additions still in development) http://www.whatwg.org/specs/web-apps/current-work/multipage/

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

前から順に評価されるからじゃない? <script type="text/javascript"> window.onload=function(){ f(); } </script> <script type="text/javascript"> function f(){ alert("hoge"); } </script> こうすれば分かれててもいけると思います

tak-st
質問者

お礼

回答ありがとうございます。 onloadはページ読み込み完了後に実行されるので、 動くのは理屈として納得できます。 前から順に評価されていくというのも理解できます。 ただ、その場合、 <script type="text/javascript"> f(); function f(){ alert("hoge"); } </script> これがどうして動くのかわからなくなってしまいます。 関数を定義する前に実行しているのに問題なく動いてしまいます。 そして、これが動くのに、どうして<script>要素をまたぐと実行できないのかなぁ。。と思った次第です。

tak-st
質問者

補足

言葉足らずでした。。 補足させていただきます。 JavaScriptは先頭から順に評価されていくものと思います。 だとすると、 <script type="text/javascript"> f(); function f(){ alert("hoge"); } </script> このコードが動く理由がわかりません。 定義よりも前に実行しているのにも関わらず 関数が実行できてしまっています。 そして、なぜこれが動くのに、 下記のコードが動かないのかがわかりません。 f()は not definedになってしまいます。 <script type="text/javascript"> f(); </script> <script type="text/javascript"> function f(){ alert("hoge"); } </script> さしあたってコードが動かなくて困っているというわけではなく、 なぜこれだと動かないのかが知りたくて質問させて頂きました。 このあたりについて、詳しい方、もしくは詳しく解説しているページ をご存知でしたら教えてください。 よろしくお願いします。

回答No.1

http://journal.mycom.co.jp/news/2008/07/25/006/index.html ブラウザによるようですが、複数のスクリプトを同時に読み込まない仕様になっているようです。

tak-st
質問者

お礼

回答ありがとうございました。

関連するQ&A

  • Javascriptで教えてください

    下記1だと実行できるのですが、2だと実行できないのはなぜでしょうか 1 <script type="text/javascript"> function OnButtonClick() { alert('クリック'); } $(function () { }) </script> 2 <script type="text/javascript"> $(function () { function OnButtonClick() { alert('クリック'); } }) </script>

  • Ajax.Updater で受けたHTML中のスクリプトを動かしたい

    Prototype.js の Ajax.Updater で受け取ったコンテンツの中で <script type="text/javascript"> .... の関数を動かしたいのですが、上手くいきません。 Ajax.Updater で受け取った下のようなHTMLをページに埋め込んで、クリックするとオブジェクトが見つかりませんと言われてしまいます。 <a href="javascript:void(intest('OK'))">テスト</a> <script type="text/javascript"> var args; function intest (args) { alert(args) } </script> どうしたら動くようになるんでしょうか?

  • 動的生成したscriptタグが実行されないのですが

    下記のように書いたら、無事scriptタグが作成できるのですが、なぜか実行されません。 $(document).ready(function(){  var script = document.createElement('script');  script.src = 'http://hoge';  script.type = 'text/javascript';  $("div#result").append(script.outerHTML); htmlにscriptタグを、直接書くと動作します。 なぜ動的生成した時だけ動かないのでしょうか? Chromeの下欄で見る限り、見た目は同じなのですが…

  • JavaScriptをURLから直接実行したい

    JavaScriptの関数として呼び出しているリンクを、直接URLアドレスから引数として値を代入して呼びしたいのですが、どうすればよろしいでしょうか? ---実際のコード--- hoge.jpsの中身 ↓JavaScriptの関数部分 <script type="text/javascript"> <!-- function searchSubmit(no) { var f = document.forms["search"] ; f.cat.value = '●●'; f.no.value = no; f.submit(); } //--> </script> ↓上の関数を呼び出している実際のページの <a href="javascript:searchSubmit('▲▲▲');"> ------------------- http://www.hogehoge.jp/hoge.jps?cat=●●&no=▲▲▲ としてブラウザーのアドレスバーに入力しても、真っ白なページになるだけで結果が表示されません。 URLに引数として記入しても、JavaScriptの方には値は代入されないのでしょうか?

  • イベントハンドラに処理を追加するには?

    例えばbodyタグのonloadイベントハンドラに JavaScriptを使って処理を追加するにはどうすればよいのでしょうか? 例) ・rei.htm <html>  <script language="JavaScript" type="text/javascript">  function hoge(){   alert("hogeです");  }  function foo(){   alert("fooです");  }  </script>  <body onload="hoge();">  </body>  <script language="JavaScript" type="text/javascript">  document.body.onload += foo();  </script> <html> ※前提条件として、変更可能な箇所はscriptタグ内のみとなります。 「こんなんでいけないかな?」と思って上記のようにやってみたのですがうまくいきませんでした。 (結果はfoo()のみ実行され、hoge()は実行されませんでした。 alertでbody.onloadの中身を確認すると『function anonymous{hoge();}undefined』と表示されるので、なぜfoo()が実行されてhoge()が実行されないのかよくわかりませんが‥) また試しに document.body.onload += foo(); これを以下のように変更してみました。 document.body.onload = foo(); この時は、 ・foo()の実行  ↓ ・javascriptエラー  ↓ ・hoge()の実行 となりました。(これもなぜこうなるのかよくわかりせん) 以上、イベントハンドラに最初から任意に入れられている処理を残しつつ、 さらに処理を加えるにはどうすればよいのかご教示お願いします。

  • htmlTextで書き出したテキストからjavascriptへ

    flashCS4 AS3.0で作業しています。 htmlTextでダイナミックテキストに <a href="javascript:void(0)" onclick="hoge();">テスト1</a> と書き込んでます。 そのswfが貼付けてあるhtmlに書いてある <script type="text/javascript" language="javascript"> <!-- function hoge(){ window.alert('ボタンを押しましたね'); } // --> </script> を動かしたいのですがウマく行きません。 どなたかいい方法しっている方いませんか?

  • 実行するスクリプトを時間で切替えたいが・・

    以下のようにHTML内に埋め込んで、時間で実行するスクリプトを切替えたいと思っていますが、何故か上手くいきません。 詳しい方がいましたら、ご教授下さいませ。 m(__)m <script language="JavaScript"> <!-- TimeH = (new Date()).getHours(); if (TimeH>=18) { <script language="Text/JavaScript" type="Text/JavaScript" src="./JS/xxx.js" charset="shift-jis"></script> } else if (TimeH<4) { <script language="Text/JavaScript" type="Text/JavaScript" src="./JS/yyy.js" charset="shift-jis"></script> } else { <script language="Text/JavaScript" type="Text/JavaScript" src="./JS/zzz.js" charset="shift-jis"></script> } // --> </script>

  • VBスクリプトの配列数字をJAVAスクリプトで使うには

    表題があまり良くないですが VBSでページを作っています その中で ページ閲覧者がテキストボックスに値を記入したときに JAVAスクリプトのonchangeでJAVAスクリプトへ飛んで VBスクリプトで定義した配列の値を代入したいのですが うまくいきません 飛んでいった先のコードが <script type="text/javascript"> <!-- //値の代入 function hoge(FRM){ FRM.hoge1.value=ここにVBスクリプトの配列 } // --> </script> これだけのことなのですが 配列を直接数字で書くと FRM.hoge1.value=<%=atai(1)%> hoge1にはきちんと値が入力されます しかし この1と言う数字の所に FRM.hoge2.value の値をいれてやろうとすると イメージとしては FRM.hoge1.value=<%=atai(FRM.hoge2.value )%> なんですが、これではエラーがでます(当然ですよね) 色々"" でくくったり & や + ()などの 組み合わせでやってもうまくいきません どなたか正しい構文か方法を教えてください よろしくお願いします  

  • 実行の順番を教えて下さい。

    ---------------------------------------------------------------------------------------------------------------- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script type="text/javascript"> ( tmp_jquery=jQuery ・・・(1) )( function(){ $=jQuery=tmp_jquery; ・・・(2) } ); </script> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script> <script> $(function(){ alert(jQuery.fn.jquery); ・・・(3) }); </script> ---------------------------------------------------------------------------------------------------------------- 上記の処理では、jQuery1.7.1をロードして後、jQuery1.2.3をロードしていますが、 (1)のところで、jQuery1.7.1を保持し、 (2)で再び$とjQuery変数にロードしているため (3)のところで、"1.7.1"と表示されます。 さて、ここで(2)の部分がいつ実行されるのかが理解できません。 そもそも、今回の処理で記述されている ()() の意味がわかりません。 クロージャーなどで、 (function(){})() と記述しますが、 function(){}を式として認識させるために丸括弧で囲っているのは、 以下のサイトで知りました。 http://d.hatena.ne.jp/amachang/20080208/1202448348 今回も同様の意味なのでしょうか? だとすれば、(1)の前に(2)が実行されそうなのですが・・・。 どなたか、ご説明お願いできないでしょうか?

  • jqueryを使いajaxで取得したデータをコールバック関数外で取得する方法

    下記のようなスクリプトでjQueryを使い、ajaxでtextを取得します。 コールバック関数内では、もちろんtextが使えるのですが、コールバック関数外からはtextに一切アクセスできなくなります。 このようにグローバルからajaxで取得したデータは取得できないのでしょうか? prototype.jsでも同じ結果です。 グローバルからの取得法、ご存知の方いらっしゃいましたらご教示頂ければと思います。 <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"><!-- $(document).ready(function (){ $.get("./sample.txt",function(text){ alert(text); // textが取得できる }); }); alert(text); // textが取得できない // --></script>

専門家に質問してみよう