ちょっと説明しづらいのですが、例えば以下の様に、
文字列を使用する場合は " や ' で囲んで表記しますが、

var s="fnc1('fnc2(\"12345\")')";
(各関数内で setTimeout 等を使用する)

さらに以下の様に、もっと文字列を囲んで使用するには、
どうすれば良いのでしょうか。(そもそも可能でしょうか?)

var s="fnc1('fnc2(''fnc3('''12345''')'')')";

A 回答 (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()\\\\\\\')\\\')\')\'
としなければならないのです。

ね?大変でしょ!?
まさしく「そんなの配列で上手く出来ないの?」です(笑)
    • good
    • 0
この回答へのお礼

すごーい!!大変だけど実際やってみるとできました!!
でも確かに、決してエレガントとは言えませんね...
ありがとうございます、すごく勉強になりました。

この知識は何だかすごく使えそうで、使い道ないかなぁ。

お礼日時:2001/05/04 20:27

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()'')');

また「文字列を各関数内で加工してみたら?」と言う案もあるかも知れません。
でも、これがもし可能なら便利だし勉強にもなるなと思った訳です。
説明が長くなってしまってスミマセンでした。
宜しくお願い致します。

補足日時:2001/05/04 11:43
    • good
    • 0

つまり、文字列として"や'を使用したいということですね。


最初の例の
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>

でも、さらに誤解を招きそうなので補足しますと、
決してこのサンプルが実現したい事ではなくて、
こんな感じで、関数の中に関数を続けて使用する方法を、
知りたくて困っているのであります。
(ひょっとしたら不可能な事かも知れません)
宜しくお願い致します。

補足日時:2001/05/03 22:51
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qjavascript の setTimeout の引数を”で囲む理由

http://crocro.com/write/manga_javascript/wiki.cgi?p=%A5%BF%A5%A4%A5%DE%A1%BC%A4%CB%A4%E8%A4%EB%BD%E8%CD%FD
の『タイマー』についての補足 他

マンガ中、タイマーの引数は『"tokei()"』と文字列で書きました。

function tokei() {
var ele = document.getElementById("target");
ele.innerHTML = Date().toLocaleString();
window.setTimeout("tokei()", 1000);
}
この部分には、関数を指定することもできます。

function tokei() {
var ele = document.getElementById("target");
ele.innerHTML = Date().toLocaleString();
window.setTimeout(tokei, 1000);
}

という部分があります。
"tokei()"と文字列で指定しているのに関数として扱われる理由
tokeiと指定してありtokei()で無いのに関数として扱われる理由を教えて下さい。

もしくは、参考になるURLを教えて下さい。

http://crocro.com/write/manga_javascript/wiki.cgi?p=%A5%BF%A5%A4%A5%DE%A1%BC%A4%CB%A4%E8%A4%EB%BD%E8%CD%FD
の『タイマー』についての補足 他

マンガ中、タイマーの引数は『"tokei()"』と文字列で書きました。

function tokei() {
var ele = document.getElementById("target");
ele.innerHTML = Date().toLocaleString();
window.setTimeout("tokei()", 1000);
}
この部分には、関数を指定することもできます。

function tokei() {
var ele = document.getElementById("ta...続きを読む

Aベストアンサー

こんにちは

書式が2種類あります。
https://developer.mozilla.org/ja/docs/Web/API/WindowTimers/setTimeout

文字列を引数にするとスクリプトのコードとして解釈されますが、この書式は非推奨になっています。

>tokeiと指定してありtokei()で無いのに関数として扱われる理由
>を教えて下さい。
第一引数にfunctionを渡すことになっているからですが、例えば
var func = function(){ alert("hoge"); }
setTimeout(func, 1000);
とした場合は、1秒後にfuncが実行されてアラートがでます。
setTimeout(func(), 1000);
とすると、setTimeoutの引数を評価する際にfuncが実行されてアラートがでますが、1秒後に実行される関数が存在しないので何も起きないことになります。

var func2 = function(){
return function(){ alert("hoge"); }
}
setTimeout(func2(), 1000);
とすれば、引数評価時にfunc2が実行され返される匿名関数が引数として評価され、1秒後にアラートがでることになります。

こんにちは

書式が2種類あります。
https://developer.mozilla.org/ja/docs/Web/API/WindowTimers/setTimeout

文字列を引数にするとスクリプトのコードとして解釈されますが、この書式は非推奨になっています。

>tokeiと指定してありtokei()で無いのに関数として扱われる理由
>を教えて下さい。
第一引数にfunctionを渡すことになっているからですが、例えば
var func = function(){ alert("hoge"); }
setTimeout(func, 1000);
とした場合は、1秒後にfuncが実行されてアラートがでます。
setTimeout(func(), ...続きを読む

Q変数内容が'変数名'の文字列なので、短く書きたい

下記のような変数が大量にあります。
変数内容は、全て'変数名'の文字列です。
var AAAAAAAQWE = 'AAAAAAAQWE', BACDCFRF = 'BACDCFRF', VZAAAWW = 'VZAAAWW',……

・変数宣言を短く書き直したいのですが、何か良い方法はあるでしょうか?
・何度も同じことを書くのは非効率な気がするのですが…

Aベストアンサー

thisは基本的にはスコープチェーンに入っていないので
thisのプロパティに設定しても
this.AAAAAAAQWEとしないと参照できないですね。
(thisがグローバルオブジェクトの場合は、参照可能になります。)

withを使えばオブジェクト名を省略して
プロパティを参照できるようになります。

var array = ['AAAAAAAQWE','BACDCFRF','VZAAAWW'];
var obj = {};
for(var i=0; i<array.length; i++) obj[array[i]] = array[i];
with(obj){
 alert(AAAAAAAQWE); //withの中では、obj. を省略できる
}


withは非推奨なのであまり使いたくないですけどね。



> ・既存コード調整なので、存在意義はとりあえずおいといていただけると有難いです
変数を全部文字列に置換するような調整はできないのでしょうか?
(AAAAAAAQWE → 'AAAAAAAQWE' みたいに置換すれば、変数宣言自体不要。)

thisは基本的にはスコープチェーンに入っていないので
thisのプロパティに設定しても
this.AAAAAAAQWEとしないと参照できないですね。
(thisがグローバルオブジェクトの場合は、参照可能になります。)

withを使えばオブジェクト名を省略して
プロパティを参照できるようになります。

var array = ['AAAAAAAQWE','BACDCFRF','VZAAAWW'];
var obj = {};
for(var i=0; i<array.length; i++) obj[array[i]] = array[i];
with(obj){
 alert(AAAAAAAQWE); //withの中では、obj. を省略できる
}


withは非推奨なの...続きを読む

Q\u30ad\u30fc\u30dc・・・という記述について

http://oshiete1.goo.ne.jp/qa4349103.html

と関連するような質問なのですが・・・

Gmailで「?」を押すとショートカットキー一覧が出ますが、その部分(の一部?)のソースコードは以下のようになっています。

try{var zza="ou5Ep",Aza='" role="alert" tabindex="-1"><table class="',Bza="tW5bCc",vF='"><tr><td class="',Cza="Xfqc1d",Dza="\u30ad\u30fc\u30dc\u30fc\u30c9 \u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8",wF='</td><td class="',Eza="AsLFV",Fza='">

以下略。

そこで質問させていただきたいのですが、「\u30ad\u30fc\u30dc\u30fc\u30c9 \u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8」の部分、
これはいったいなにものでしょうか?

http://homepage3.nifty.com/jgrammar/ja/tools/codeval0.htm
に書いてあることが答えなのかな・・と思ったのですが・・・いまいち分からず・・・
特に、なぜ、「\uxxxx」(x の部分は16進法書式?)という形式なのでしょうか?(JavaScript固有の書式?)

また、なぜ、UTF-8で「あいうえお」のように書かないのでしょうか?このようにすることでなにかメリットがあるのでしょうか?

よろしくお願いいたします。

http://oshiete1.goo.ne.jp/qa4349103.html

と関連するような質問なのですが・・・

Gmailで「?」を押すとショートカットキー一覧が出ますが、その部分(の一部?)のソースコードは以下のようになっています。

try{var zza="ou5Ep",Aza='" role="alert" tabindex="-1"><table class="',Bza="tW5bCc",vF='"><tr><td class="',Cza="Xfqc1d",Dza="\u30ad\u30fc\u30dc\u30fc\u30c9 \u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8",wF='</td><td class="',Eza="AsLFV",Fza='">

以下略。

そこで質問させて...続きを読む

Aベストアンサー

\uXXXX というのは、文字列中でUnicode(UTF-16)形式で文字コードを
指定する方法です。

HTMLにおける &#xXXXX; とほぼ同様と思っていいと思います。
これは、C(C++?)でも対応しているはずです。
因みに、Gmailってたぶん、海外で作成されているんですよね。
なので、日本語文字を普通にIME入力できないからコード入力している
だけじゃないでしょうか。

Qfor(var i=0;...) の i の値を保持するには?

-----
<ul>
<li>test1</li>
<li>test2</li>
<li>test3</li>
</ul>

<script type='text/javascript'>
(function(){
var li = document.getElementsByTagName('li');

for(var i=0,max=li.length; i<max; i++){
li[i].onclick = function(){
alert(i);
};
}
})();
</script>
-----

上記スクリプトを実行すると、全てのli要素でクリックしたときに "3" がalertされます。
0,1,2 をそれぞれalertしたいのですが、どういった方法が考えられるでしょうか?

現在作成しているスクリプトでは、下記のようにidに値を保持しています。
もう少しスマートな方法がある気がするのですが…。

---
li[i].id = 'test' + i;
li[i].onclick = function(){
alert(this.id.replace(/^test(\d+)/, '$1'));
};
---

-----
<ul>
<li>test1</li>
<li>test2</li>
<li>test3</li>
</ul>

<script type='text/javascript'>
(function(){
var li = document.getElementsByTagName('li');

for(var i=0,max=li.length; i<max; i++){
li[i].onclick = function(){
alert(i);
};
}
})();
</script>
-----

上記スクリプトを実行すると、全てのli要素でクリックしたときに "3" がalertされます。
0,1,2 をそれぞれalertしたいのですが、どういった方法が考えられるでしょうか?

現在作成しているスクリプトでは、...続きを読む

Aベストアンサー

http://nanto.asablo.jp/blog/2005/12/04/165848
メモリーリークにみえて、そうでない・・・

>HTMLObjectに勝手にプロパティ
これはよくないことだじょ!そうおそわった。

ついでにいうと、いべんとをなんこもていぎするより
No3.みたいにおおもとにひとつでじゅうぶん。
innerHTMLで、ぜんたいをかきかえたとしてもOK!
と、TAGindex
http://www.tagindex.com/cgi-lib/q4bbs/patio.cgi
でおそわったじょ!

Qjavascriptのソースでvar result = c * (t

javascriptのソースでvar result = c * (t /= d) * t + b;という関数は何を計算しているのでしょうか?


東京インタラクティブ・アド・アワードのサイトのソースをみたのですが、
http://tokyo.interactive.ad.awards.jp/Results09/index.html

ソースの中にある

<script type="text/javascript">
smoothEaseIn = function(t, b, c, d){
var result = c * (t /= d) * t + b;
return result;
}
//new wrapScroll('sidemenu','content');
var mov2 = new wrapScroll('backtop','content05');
mov2.setTween(smoothEaseIn, 100);
</script>

のうち、

==

smoothEaseIn = function(t, b, c, d){
var result = c * (t /= d) * t + b;
return result;

==

の部分は何を計算しているのでしょうか?
「c * (t /= d) * t + b;」の部分はどういう意味でしょうか?

この部分が「wrapscroll.js」をあらわしているのはわかるのですが、その他のことがあまりわかりません。

詳しい方、ご教授いただけませんでしょうか?

javascriptのソースでvar result = c * (t /= d) * t + b;という関数は何を計算しているのでしょうか?


東京インタラクティブ・アド・アワードのサイトのソースをみたのですが、
http://tokyo.interactive.ad.awards.jp/Results09/index.html

ソースの中にある

<script type="text/javascript">
smoothEaseIn = function(t, b, c, d){
var result = c * (t /= d) * t + b;
return result;
}
//new wrapScroll('sidemenu','content');
var mov2 = new wrapScroll('backtop','content05');
mov2...続きを読む

Aベストアンサー

mov2.setTween(smoothEaseIn, 100);

.setTweenはwrapScroll.prototypeに設定されているメソッドですが

//wrapscroll.jsの断片
 setTween: function(f,d){
  if(f){
   this.tween=f;
  }
  if(d){
   this.Duration=d;
  }
 },
 tween: function(t,b,c,d){
  return c * (t /= d) * t + b;
 }

渡された引数をmov2.tween, mov2.Durationに代入してます。プロパティー追加メソッドですね。
Durationのデフォルト値は60ですが、smoothEaseIn関数はあらかじめ用意されてる
tweenメソッドとまったく同じ処理ですから

mov2.setTween(false, 100);

こう書けます。

//wrapscroll.jsの断片
o.e.style.top = t.tween(t._timer++, s, e - s, t.Duration, o.e.style) + 'px';

tweenメソッドはタイマーで呼ばれ続けます。スムースに移動させる肝ですね。
それぞれの値ですが、_timerは実行ごとに1増えるカウンタ。
sは位置設定する要素の配置位置(obj.offsetTop)。eは表示領域上端位置(スクロール量)。
DurationはsetTweenに渡した100。
o.e.styleはオプション。デフォルトでは使われてませんね。

まとめると。

c * (t /= d) * t + b;
表示領域上端と要素位置との差 * (カウンタ /= 100) * カウンタ + 要素位置;

誤読がなければこのように読めるかと。

//単純にした式
smoothEaseIn = function(t, b, c, d, s){
return b + c; //要素位置 + 表示領域上端と要素位置との差
}

mov2.setTween(smoothEaseIn, 100);

.setTweenはwrapScroll.prototypeに設定されているメソッドですが

//wrapscroll.jsの断片
 setTween: function(f,d){
  if(f){
   this.tween=f;
  }
  if(d){
   this.Duration=d;
  }
 },
 tween: function(t,b,c,d){
  return c * (t /= d) * t + b;
 }

渡された引数をmov2.tween, mov2.Durationに代入してます。プロパティー追加メソッドですね。
Durationのデフォルト値は60ですが、smoothEaseIn関数はあらかじめ用意されてる
...続きを読む


人気Q&Aランキング

おすすめ情報