No.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()\\\\\\\')\\\')\')\'
としなければならないのです。
ね?大変でしょ!?
まさしく「そんなの配列で上手く出来ないの?」です(笑)
すごーい!!大変だけど実際やってみるとできました!!
でも確かに、決してエレガントとは言えませんね...
ありがとうございます、すごく勉強になりました。
この知識は何だかすごく使えそうで、使い道ないかなぁ。
No.2
- 回答日時:
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()'')');
また「文字列を各関数内で加工してみたら?」と言う案もあるかも知れません。
でも、これがもし可能なら便利だし勉強にもなるなと思った訳です。
説明が長くなってしまってスミマセンでした。
宜しくお願い致します。
No.1
- 回答日時:
つまり、文字列として"や'を使用したいということですね。
最初の例の
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>
でも、さらに誤解を招きそうなので補足しますと、
決してこのサンプルが実現したい事ではなくて、
こんな感じで、関数の中に関数を続けて使用する方法を、
知りたくて困っているのであります。
(ひょっとしたら不可能な事かも知れません)
宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ResultSetの内部構造(Java)
-
ダブルクォーテーションを含む...
-
DateTimePickerに値を入れたい...
-
結合した文字列をファイル名に...
-
BCD形式で時刻を!
-
excel vba 時間計算と条件分岐...
-
VB6,論理演算子Orの使い方がわ...
-
12+21=1221??
-
javaのCSVデータ読込についてです
-
wsprintf関数の使い方について
-
char型での演算子
-
C言語の変数(LSB)の合わせ込...
-
VBAで処理しようとしているので...
-
Integer型やArrayList型をint型...
-
ファイルを開く際に規定のexeを...
-
素朴な疑問
-
n進数から10進数に変換するには
-
ダブルクォーテーションとシン...
-
直し方について教えて頂きたい...
-
日付や時刻の"01"を" 1"に変換...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルクォーテーションを含む...
-
wsprintf関数の使い方について
-
javaのCSVデータ読込についてです
-
ArrayListの要素数の上限
-
BCD形式で時刻を!
-
DateTimePickerに値を入れたい...
-
excel vba 時間計算と条件分岐...
-
日付や時刻の"01"を" 1"に変換...
-
Stringクラスの変数の格納アド...
-
C言語の変数(LSB)の合わせ込...
-
Evaluate()に文字列の形式の数...
-
char型での演算子
-
実行シェルからCOBOLへパラメー...
-
DOSバッチで変数の値を変数名に...
-
レジストリの値の取得のデータ...
-
hiddenの値を消したくない!
-
結合した文字列をファイル名に...
-
ResultSetの内部構造(Java)
-
String型の値が大文字か小文字...
-
javaの演算子の部分ですが 4行...
おすすめ情報