変数を設定したとき、その変数、つまり文字列の格納された
箱の名前にコンタクトすることはできないのでしょうか。
つまり、次のようなコードを考えています。
var sq = 'sq';
var sw = 'sw';
var se = 'se';
var sr = 'sr';
var st = 'st';
var s,q,w,e,r,t;
var v = new Array(q,w,e,r,t)
for(i=0;i<v.length;i++){
alert(s+v[i])
}
//alert(typeof sq)//string
もし、任意の変数に対してループによるコンタクトができれば、
コードの長さも節約でき、後から変数に対応した文字列を取り
出すこともできて大変便利だと思うのですが、できません。
アプローチのし方が他にあるのでしょうか。
いつも初歩的な質問ですいません。
よろしくお願いいたします。
--
板橋
kunit...@h2.dion.ne.jpさんは書きました。
> 変数を設定したとき、その変数、つまり文字列の格納された
> 箱の名前にコンタクトすることはできないのでしょうか。
ブラウザ上のJavaScriptでは変数「x」は「window['x']」でも参照で
きます。で、
> var sq = 'sq';
> var sw = 'sw';
> var se = 'se';
> var sr = 'sr';
> var st = 'st';
これはよいとして
> var s,q,w,e,r,t;
> var v = new Array(q,w,e,r,t)
これは謎です。未定義値の入った変数q,w,e,r,tを参照したら未定義値
が5つ並んだ配列ができますが、それはやりたいことではないでしょ?
var v = ['q','w','e','r','t'];
とするべきなんじゃないですか? そのうえで
> for(i=0;i<v.length;i++){
> alert(s+v[i])
alert(window['s'+v[i]]);
> }
じゃないですかね。いたはしさん、変数(名)と文字列の区別がそーとー
危ういという気がしますのでご注意を。それにしても。
> もし、任意の変数に対してループによるコンタクトができれば、
> コードの長さも節約でき、後から変数に対応した文字列を取り
> 出すこともできて大変便利だと思うのですが、
どういう風に便利になるのか想像もつきません。上記のようにできるこ
とはできますんで、便利になった例が何か書けたら紹介してください。
楽しみにしています。
> いつも初歩的な質問ですいません。
これは…初歩的じゃあないような気がします。 久野
久野さん wrote:
> どういう風に便利になるのか想像もつきません。上記のようにできるこ
> とはできますんで、便利になった例が何か書けたら紹介してください。
setTimeout( "code" , time ) でタイマー処理を行うときに便利そうですね。
setTimeout でアクセスできる変数はグローバル変数ですから。
一定時間間隔で self-refresh するようなオブジェクトを作るようなコード、
たとえば次のサンプルコードで、下から4行目の部分とか間抜けですよね。
__(ここから)__
<form name="testform"><textarea rows="100" name="testarea"></textarea></form>
<script type="text/javascript">
function SelfRefreshObject( _name , _interval )
{
function _update(){
document.testform.testarea.value += "hello\n";
this.timeId = setTimeout ( this.name + ".update()" , this.interval );
}
function _start(){
document.testform.testarea.value = "";
this.update();
}
function _stop(){
clearTimeout( this.timeId );
}
this.timeId = null;
this.name = _name;
this.interval = _interval;
this.update = _update;
this.start = _start;
this.stop = _stop;
return this;
}
var oSR = new SelfRefreshObject( "oSR" , 100 ); //←oSRを2回もいわないとダメ?
oSR.start();
setTimeout( "oSR.stop()" , 10000 );
</script>
~~(ここまで)~~
--
赤間俊一 ak...@home.so-net.ne.jp
# ちょっと脱線。
I wrote:
> 一定時間間隔で self-refresh するようなオブジェクトを作るようなコード、
> たとえば次のサンプルコードで、下から4行目の部分とか間抜けですよね。
で、このコードにおいては、久野さんの例ではうまく行かないわけです。
JavaScript には sleep がありませんから(最近のならあるのかも)、一定間
隔で self-update するオブジェクトを作るためには、
- 先ほどのようなトリッキーなコードで逃げる
- 指定時刻が来るまでCPU使用率100%のループ(これはナンセンス)
として実装するしかないかなぁ、と考えています。
なにかよい実装ってありますか?
-*-
このことがあって、「生成されたオブジェクトが、自身を参照できるインス
タンス名をプロパティとして保持してほしいな。」と考えたことがあります。
どういう仕様を提案したらよいか考えているうちに面倒くさくなってやめて
しまいましたが、名前空間の問題をきれいに解決できる仕様が考案されれば
けっこう役立ちそうな気はします。
--
赤間俊一 shu...@axis.t.u-tokyo.ac.jp
> setTimeout( "code" , time ) でタイマー処理を行うときに便利そう
> ですね。setTimeout でアクセスできる変数はグローバル変数ですから。
だからsetTimeout()に文字列渡しちゃいけないと思ってます。関数渡
せばスコープはまっとうに制御できるでしょ? なんでみんな文字列渡し
たりevalしたりとか好きなのかなあ。
宝の持ち腐れだと思うな。 久野
ku...@gssm.otsuka.tsukuba.ac.jpさん wrote:
> だからsetTimeout()に文字列渡しちゃいけないと思ってます。関数渡
> せばスコープはまっとうに制御できるでしょ? なんでみんな文字列渡し
> たりevalしたりとか好きなのかなあ。
だから、「できない」のです。
次の2つのコードを比較してください。
このコードに期待することは10秒後に"hello"という文字を表示させることで
す。関数で渡す場合は「即座」に評価されることがわかると思います。
__(その1はここから)__
<script>
function TestObject(){
function _hello()
{
setTimeout( this.hello2(), 10000 ); //←ここが違う
}
function _hello2()
{
alert("hello");
}
this.hello = _hello;
this.hello2 = _hello2;
return this;
}
var oTO = new TestObject();
oTO.hello();
</script>
~~(その1はここまで)~~
__(その2はここから)__
<script>
function TestObject(){
function _hello()
{
setTimeout( "oTO.hello2()", 10000 ); //←ここが違う
}
function _hello2()
{
alert("hello");
}
this.hello = _hello;
this.hello2 = _hello2;
return this;
}
var oTO = new TestObject();
oTO.hello();
</script>
~~(その2はここまで)~~
--
赤間俊一 ak...@home.so-net.ne.jp
ku...@gssm.otsuka.tsukuba.ac.jpさん wrote:
> 宝の持ち腐れだと思うな。 久野
もしかして、致命的に勘違いされているのでしょうか。
hoge( fuga() );
と書くと、fuga() の方が先に実行されます。
--
赤間俊一 ak...@home.so-net.ne.jp
> もしかして、致命的に勘違いされているのでしょうか。
>
> hoge( fuga() );
>
> と書くと、fuga() の方が先に実行されます。
久野さんの関数を渡すというのは、
hoge(fuga);
ということだと思いますよ。ということで、
> このコードに期待することは10秒後に"hello"という文字を表示させることで
> す。関数で渡す場合は「即座」に評価されることがわかると思います。
>
> __(その1はここから)__
> <script>
> function TestObject(){
> function _hello()
> {
> setTimeout( this.hello2(), 10000 ); //←ここが違う
setTimeout( this.hello2, 10000 );
とすれば期待通りになりませんか?
--
12/31 07:44頃
水戸
co_...@ybb.ne.jpさん:
> hoge(fuga);
> ということだと思いますよ。
です。
> > hoge( fuga() );
じゃ関数は渡してないですよね。
関数を呼んだ返値を渡している。 久野
うは。不勉強をさらしてしまいました。
こんな拡張があったのですね。
http://www2u.biglobe.ne.jp/~oz-07ams/prog/js-notes/setTimeout.html
もうしわけない > 久野さん
Mito <co_...@ybb.ne.jp>さん wrote:
> setTimeout( this.hello2, 10000 );
>
> とすれば期待通りになりませんか?
--
赤間俊一 ak...@home.so-net.ne.jp
ak...@home.so-net.ne.jpさん:
> こんな拡張があったのですね。
JavaScript 1.2からの機能のようですね。 久野
もう既に解決しているようなのですが,以下のようなものはIE6では一応動きま
す。(私のパソコンでの話)
で,これは文法的に正しいのかどうかさっぱり分かりません。どんなもんなんでしょ
うかね。
(というのも,少しコードをいじると理解し難い動きをします。)
<html>
<body>
<form name="testform"><textarea rows="20" name="testarea"></textarea></form>
<script type="text/javascript">
function SelfRefreshObject(interval) {
var defmsg = "hello\n";
var msg = "";
function update() {
msg += defmsg;
document.testform.testarea.value = msg;
this.timerId = setTimeout(update, interval);
}
function start() {
update();
}
function stop(tm) {
function clear() {
clearTimeout(this.timerId);
}
setTimeout(clear, tm)
}
function echo(str) {
document.testform.testarea.value = str;
}
this.echo = echo;
this.start = start;
this.stop = stop;
}
var oSR = new SelfRefreshObject(1000);
oSR.start();
oSR.stop(10000);
setTimeout("oSR.echo('end\\n')",12000);
</script>
</body>
</html>
--
******************************
keizi kounoike
******************************
> もう既に解決しているようなのですが,以下のようなものはIE6で
> は一応動きます。(私のパソコンでの話)で,これは文法的に正しい
> のかどうかさっぱり分かりません。どんなもんなんでしょうかね。
別に文法として悪いところはなさそうですけど。
> var oSR = new SelfRefreshObject(1000);
> oSR.start();
> oSR.stop(10000);
> setTimeout("oSR.echo('end\\n')",12000);
この最後のを
setTimeout(function() { oSR.echo('end\n'); }, 12000);
とかしたいわけですよ。そうすればoSRがグローバル変数でなくても動
きますからね。
文字列やめたいとはそういう意味。 久野
新年、あけましておめでとうございます。
In message news:bss3ka$2m...@utogw.gssm.otsuka.tsukuba.ac.jp
<ku...@gssm.otsuka.tsukuba.ac.jp> wrote ...
> だからsetTimeout()に文字列渡しちゃいけないと思ってます。関数渡
> せばスコープはまっとうに制御できるでしょ? なんでみんな文字列渡し
> たりevalしたりとか好きなのかなあ。
まぁ evaluate は 1.0 からの仕様ですので、意味のあまり無いこと
ではあるけど、必要があれば関数渡し、必要なければ文字列でと
しています。
元の問題に関して、見たときは eval と Function を思いついて、
window['vars'] は全然思いつかなかったです。(^^;
ただ、eval だとローカルでも使えるという利点はあると思います。
function test() {
var sq = 'sq';
var sw = 'sw';
var se = 'se';
var sr = 'sr';
var st = 'st';
alert(se); // se
var v = new Array('q','w','e','r','t');
for (var i=0; i < v.length; i++)
eval('s'+v[i]+"='s'+"+i); // s? = 's' + i
alert(se); // s2
}
test();
で、変数を何らかの方法で配列として扱うことについて、なにか
意味があるかというと・・・
おそらく、その変数を使っている部分の可読性が上がるとかいう
話になると思うのですが、変に小細工しても、他の人が見たとき
初期化部分等がわかりづらいという、本末転倒になりそうな方法
ですので、あまりお勧め出来ないところです。> 板橋さん
やりたいことというのは、ある程度の可読性があって、ループで
アクセス可能(ただしアクセス名は別配列等でも可?)な方法という
ことになる気もしますので、(制限された)仕様のなかで考えると、
連想配列を使って、
var s = new Array();
s['q'] = 'sq';
s['w'] = 'sw';
s['e'] = 'se';
s['r'] = 'sr';
s['t'] = 'st';
alert(s['e']); // se
var v = new Array('q','w','e','r','t');
for (var i=0; i < v.length; i++)
s[v[i]] = 's' + i;
alert(s['e']); // s2
といったあたりではどうでしょうか。