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>
でも、さらに誤解を招きそうなので補足しますと、
決してこのサンプルが実現したい事ではなくて、
こんな感じで、関数の中に関数を続けて使用する方法を、
知りたくて困っているのであります。
(ひょっとしたら不可能な事かも知れません)
宜しくお願い致します。
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.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()\\\\\\\')\\\')\')\'
としなければならないのです。
ね?大変でしょ!?
まさしく「そんなの配列で上手く出来ないの?」です(笑)
すごーい!!大変だけど実際やってみるとできました!!
でも確かに、決してエレガントとは言えませんね...
ありがとうございます、すごく勉強になりました。
この知識は何だかすごく使えそうで、使い道ないかなぁ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Excel(エクセル) 【画像あり】A1が●+B1と同じ文字がB列にある+C1と同じ文字がC列にある場合D1に〇を付ける 3 2023/03/09 18:18
- その他(コンピューター・テクノロジー) googleスプレッドシートでカッコ内の文字数をカウントしたい 1 2023/01/17 15:52
- Excel(エクセル) Excelの空文字判定について 7 2023/01/06 13:25
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Excel(エクセル) エクセル関数について 2 2022/05/30 14:36
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- Excel(エクセル) 関数を用いて表示したセルの内容を、見えている形でコピーする方法 2 2022/09/14 16:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
このプログラミング誰か教えて...
-
ダブルクォーテーションを含む...
-
このプログラミング誰か教えて...
-
BCD形式で時刻を!
-
ArrayListの要素数の上限
-
JSPでHashMap・配列の変数の値...
-
Evaluate()に文字列の形式の数...
-
8桁整数を限りなく短い文字列に...
-
DateTimePickerに値を入れたい...
-
特定の文字列を複数抜き出した...
-
Stringクラスの変数の格納アド...
-
バイト配列からfloat型の数値を...
-
wsprintf関数の使い方について
-
matchesを否定文として使う方法...
-
javaのCSVデータ読込についてです
-
getParameterの値変更
-
C# LinqでDateTime型の値を取得
-
DOSバッチで変数の値を変数名に...
-
実行シェルからCOBOLへパラメー...
-
【Excel VBA】繰り返し処理がで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルクォーテーションを含む...
-
wsprintf関数の使い方について
-
javaのCSVデータ読込についてです
-
ArrayListの要素数の上限
-
特定の文字列を複数抜き出した...
-
Stringクラスの変数の格納アド...
-
結合した文字列をファイル名に...
-
BCD形式で時刻を!
-
DateTimePickerに値を入れたい...
-
Evaluate()に文字列の形式の数...
-
実行シェルからCOBOLへパラメー...
-
hiddenの値を消したくない!
-
DOSバッチで変数の値を変数名に...
-
C言語の変数(LSB)の合わせ込...
-
excel vba 時間計算と条件分岐...
-
Javaの問題なのですが、「3文字...
-
matchesを否定文として使う方法...
-
8桁整数を限りなく短い文字列に...
-
JSPでの計算結果表示
-
指定した日付が何日前なのかを...
おすすめ情報