- ベストアンサー
文字列を表記する際の " や ' について
ちょっと説明しづらいのですが、例えば以下の様に、 文字列を使用する場合は " や ' で囲んで表記しますが、 var s="fnc1('fnc2(\"12345\")')"; (各関数内で setTimeout 等を使用する) さらに以下の様に、もっと文字列を囲んで使用するには、 どうすれば良いのでしょうか。(そもそも可能でしょうか?) var s="fnc1('fnc2(''fnc3('''12345''')'')')";
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.2のleaz024です。 >ある時は fnc1('fnc2(''fnc3('''fnc4()''')'')'); >ある時は fnc2('fnc1(''fnc4()'')'); >ある時は fnc2('fnc3(''fnc4()'')'); これ、大変ですよ!? 最初の例を使って、順を追って説明しますね。 fnc1の引数は、 'fnc2(' , 'fnc3(' , '' , fnc4() , '' , ')' , ')' と分解されてしまうので、1つの文字列にはなりません。 'で囲まれた文字列内で'を文字として使う場合、\を使ってエスケープします。(ご存知ですよね?) つまり、次のように指定する必要があるわけです。 fnc1('fnc2(\'fnc3(\'fnc4()\')\')\'); こうするとfnc1内のsetTimeout関数からは、 fnc2('fnc3('fnc4()')') が実行されます。 するとfnc2の引数は 'fnc3(' , fnc4() , ')' と分解され、やはり文字列になりません。 文字列内の'をエスケープするには、元のfnc1の引数の方に\\をいれておく必要があるわけです。 つまり、fnc2の引数を 'fnc3(\'fnc4()\')' とするためには、fnc1の引数を 'fnc2(\'fnc3(\\\'fnc4()\\\')\')\' としておく必要があるのです。 引数として飛ばされるたびに \\→\ \'→' と変換されるため、最初の引数にエスケープコード(\)をたくさん並べることになるのです。 つまり、更にfnc4からfnc5を呼ぶとしたら、fnc1の引数を 'fnc2(\'fnc3(\\\'fnc4(\\\\\\\'fnc5()\\\\\\\')\\\')\')\' としなければならないのです。 ね?大変でしょ!? まさしく「そんなの配列で上手く出来ないの?」です(笑)
その他の回答 (2)
- leaz024
- ベストアンサー率75% (398/526)
No.1の補足を読んでの補足要求です。 >関数の中に関数を続けて使用する方法 とありますが、もう少し具体的に書いていただきたいのですが、、、 そもそも「関数の中」とは、どこを指しているのですか?呼び出し部の実引数を指定するところですか?定義した関数本体の中ですか? 「サンプルの内容を実現したいわけではない」ようなことが書いてありますが、このサンプル自体かなり"変わった"ことをしようとしているので、「こんな感じで」と言われても、結局このサンプルを実現するしかないのでは?と思えてしまいます。(私の読解力不足かもしれませんが) tasahamuさんが実際に行いたいのは、サンプルとはどの程度違うのですか? サンプルを実現しても解決できないような問題ですか?
補足
お騒がせしてまして、本当に申し訳ないです!! > そもそも「関数の中」とは、どこを指しているのですか? 「呼び出し部の実引数を指定するところ」です。 > このサンプル自体かなり"変わった"ことを やっぱそうですよね。 もう少し状況を詳しく説明させて頂きますと、 Windows で動いている業務用の「デジカメプリントマシン」がありまして、 訳あってそのソフトウエアの体験版を、汎用性のある IE と NN 用として、 JavaScript で作成していたのです。 つまり「普通こんなの JavaScript で作らないよ」って位複雑だったんです。 そこで、ライブラリを作成しながら、なるべくスッキリとしたプログラムを、 作成しようとしていたのです。 もちろん、その実現自体は他の方法でも可能なのですが、ふと思った訳です。 例えば、色々な効果音(2秒とか10秒とか)を色々続けて鳴らしたい時、 画像の onload の様に1つの効果音が終了した事を知る方法がないので、 それぞれの効果音を1つ1つの関数にし、各関数内で特定の隠しレイヤーに、 <EMBED> タグを書き込み、平行して setTimeout を使用するといった方法を、 取っていたんです。 「そんなの配列で上手く出来ないの?」と言われればそれまでですが、 例えば、以下の様に出来たら便利だなと思った訳です。 fnc1(次の関数) {入金の効果音、2秒、特定の処理} fnc2(次の関数) {説明の効果音、8秒、特定の処理} fnc3(次の関数) {機械の効果音、5秒、特定の処理} fnc4(次の関数) {返金の効果音、3秒、特定の処理} ある時は fnc1('fnc2(''fnc3('''fnc4()''')'')'); ある時は fnc2('fnc1(''fnc4()'')'); ある時は fnc2('fnc3(''fnc4()'')'); また「文字列を各関数内で加工してみたら?」と言う案もあるかも知れません。 でも、これがもし可能なら便利だし勉強にもなるなと思った訳です。 説明が長くなってしまってスミマセンでした。 宜しくお願い致します。
- shinjif
- ベストアンサー率33% (30/90)
つまり、文字列として"や'を使用したいということですね。 最初の例の var s="fnc1('fnc2(\"12345\")')"; の\マークがポイントです。 "や'を本来の文字列データを囲む記号としてではなく、文字列の一部として使用したい場合はその直前に\マークを付けてください。 var s="fnc1('fnc2(\"12345\")')"; は変数sにfnc1('fnc2("12345")') という文字列が格納されます。 var s="fnc1('fnc2("fnc3("'12345'")")')"; についてですが、sに fnc1('fnc2("fnc3("'12345'")")') という文字列を格納したいのなら"の直前に\マークを付ければよいのです。 var s="fnc1('fnc2(\"fnc3(\"'12345'\")\")')" JavaScriptは文字列を囲む記号として "と'の両方が指定できますので、わかりやすくするためには'の方も\マークを付けて var s="fnc1(\'fnc2(\"fnc3(\"\'12345\'\")\")\')" とした方が良いかもしれません。\がついていることによって、これは文字列として扱って欲しいのだという意思表示になりますから・・・ ちなみに、文字列として\を指定したい時は\\と書けば大丈夫です。 \の様な働きをする文字のことを「エスケープシーケンス」「エスケープ文字」と言います。
補足
せっかくのご回答、大変申し訳ありません。 やっぱり私の説明が悪いのだと思います。 説明しづらいので、以下にサンプルを作りました。 <HTML><HEAD><SCRIPT LANGUAGE="JavaScript"><!-- function fnc1(s) {document.bgColor="red"; setTimeout(s,2000);} function fnc2(s) {document.bgColor="green"; setTimeout(s,2000);} function fnc3(s) {document.bgColor="blue"; /*setTimeout(s,2000);*/} var s="fnc1('fnc2(\"fnc3()\")')"; document.bgColor="white"; setTimeout(s,3000); //--></SCRIPT></HEAD><BODY></BODY></HTML> でも、さらに誤解を招きそうなので補足しますと、 決してこのサンプルが実現したい事ではなくて、 こんな感じで、関数の中に関数を続けて使用する方法を、 知りたくて困っているのであります。 (ひょっとしたら不可能な事かも知れません) 宜しくお願い致します。
お礼
すごーい!!大変だけど実際やってみるとできました!! でも確かに、決してエレガントとは言えませんね... ありがとうございます、すごく勉強になりました。 この知識は何だかすごく使えそうで、使い道ないかなぁ。