JavaScript の質問用スレッド vol.11

このエントリーをはてなブックマークに追加
336Name_Not_Found
>>335
だから、function() {...}の中から外側の変数を参照している場合、その変数
への参照が後からでもできるように手当てされるのです。こういうのをクロージャ
と言います。ただし参照できるのはあくまでも変数でして、thisっていうのは変数
ではない(オブジェクトを表す疑変数というべきか)。なのでthis1への代入が必要
なんですよね。JavaScriptって結構奥が深いでしょ。
337Name_Not_Found:02/07/25 15:51 ID:???
>>336
なるほど、深いですね。
勉強になりました。
ところで、そういう知識って一体どこで習得してるんですか?
ECMAScriptの仕様書とかに載ってます?
338Name_Not_Found:02/07/25 15:56 ID:???
>>337
JavaScript解説本とかはとりあえずいくつか読みましたけどね。
もちろんECMA-262には仕様書なんだから載っていると思うけど、
仕様書って読みづらいんですよね。
339Name_Not_Found:02/07/25 16:05 ID:???
>>338
さっきのタイマーオブジェクトのコードで、さらに配列を引数にしてみても、ちゃんと動きました。
なんかもう、Hello Worldが表示できたときと同じくらい感激です!
細かく解説してくれた上にJavaScriptの視野まで広げてもらって、
本当に有難うございました。
340Name_Not_Found:02/07/25 19:02 ID:???
>>337
マイクロソフトのリファレンスが最も詳しい。
341Name_Not_Found:02/07/25 19:09 ID:yNoqFQbU
>>340
オブジェクトの仕様とかは分かるけど、関数がクロージャになるだとか
thisの意味だとかはMSのサイトのどこに載っているの?
342Name_Not_Found:02/07/25 19:46 ID:???
>>341
JScriptのリファレンス
343Name_Not_Found:02/07/25 19:58 ID:???
>>342
「thisステートメント」とか書いてある怪しいやつなw
クロージャについての記述はぜひ読みたいのでURLきぼんぬ。
344Name_Not_Found:02/07/25 21:50 ID:???
fagaae
o
345ミトコンドリア:02/07/25 23:49 ID:XvftP0Mc
すいません。教えて欲しいのですが、
「2〜3枚の絵をアニメーションとして順番に表示させるようにする」
っは出来るのですが、
「一つの画面上で別の複数のアニメーションを表示させる」になると、エラーが出っ放しでわかりません…
JavaScriptでしたいのです。教えてください
346Name_Not_Found:02/07/25 23:54 ID:???
>>345
とりあえずソースとエラー内容を知りたいのです。教えてください
347ミトコンドリア:02/07/26 00:00 ID:19aA7EsN
<html>
<head><title>ヨッシー島入口</title></head>
<script language="JavaScript">
<!--
gazou=new Array();
gazou[1]=new Image();
gazou[1].src="/icon/info-01.jpg";
gazou[2]=new Image();
gazou[2].src="/icon/info-02.jpg";
gazou[3]=new Image();
gazou[3].src="/icon/info-03.jpg";
imgNum=0
function anime(){
if(imgNum==0){document.mylmg.src=gazou[1].src;
imgNum=1;
}else if(imgNum==1){
document.mylmg.src=gazou[2].src;
imgNum=2;
}else if(imgNum==2){
document.mylmg.src=gazou[3].src;
imgNum=0;
}
setTimeout("anime()",2000)
}

↑これが一つ目。これは表示されました。
っが、二個目からどうすればいいのかわからなくて

gazou[4]=new Image();
gazou[4].src="/icon/com-01.jpg";
gazou[5]=new Image();
gazou[5].src="/icon/com-02.jpg";
imgNum=0
function anime(){
if(imgNum==0)
{document.kominike.src=gazou[4].src;
imgNum=1;
}else if(imgNum==1){
document.kominike.src=gazou[5].src;
imgNum=0;
}
setTimeout("anime()",2000)
}
//--></script>

↑ってまとめてしまいました。(名前を微妙に変えて…)
んで<body onLoad="anime()">で
一つ目<img src="/icon/info-01.jpg" name="mylmg" alt="vision" width="230" height="60" border="1" >
二つ目><img src="/icon/com-01.jpg" name="cominike" alt="vision" width="230" height="60" border="1" >

っです。これでアップしたところ一つ目の絵も動かなくなりました。
348Name_Not_Found:02/07/26 01:06 ID:???
>>347
呼び出す関数名「anime()」がだぶってるから
349Name_Not_Found:02/07/26 01:42 ID:???
>>347
<script language="JavaScript">
<!--
gazou1=new Array();
gazou1[0]=new Image(); gazou1[0].src="./icon/info-01.jpg";
gazou1[1]=new Image(); gazou1[1].src="./icon/info-02.jpg";
gazou1[2]=new Image(); gazou1[2].src="./icon/info-03.jpg";

gazou2=new Array();
gazou2[0]=new Image(); gazou2[0].src="./icon/com-01.jpg";
gazou2[1]=new Image(); gazou2[1].src="./icon/com-02.jpg";

imgNum=0;

function anime(){
imgNum++;

Che1 = imgNum % 3;
Che2 = imgNum % 2;

document.mylmg.src=gazou1[Che1].src;
document.cominike.src=gazou2[Che2].src;

setTimeout("anime()",2000)
}
//-->
</script>

<body onLoad="anime()">

<img src="./icon/info-01.jpg" name="mylmg" alt="vision" width="230" height="60" border="1" >
<img src="./icon/com-01.jpg" name="cominike" alt="vision" width="230" height="60" border="1" >

animeの関数が呼ばれるたびに imgNum に +1
imgNum を 3 で割った余りによって gazou1[0]、gazou1[1]、gazou1[2] を変更
imgNum を 2 で割った余りによって gazou2[0]、gazou2[1] を変更
頭の悪そうなスクリプトですまん。
350Name_Not_Found:02/07/26 09:08 ID:IWPlyemV
>>349 私も書いて見ました。昨日の成果(?)を生かして。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head><title>???</title>
<script type="text/javascript">
function init() {
var a = [new Image(),new Image(),new Image()];
var b = [new Image(),new Image()];
a[0].src = 't1.png'; a[1].src = 't2.png'; a[2].src = 't3.png';
b[0].src = 't1.png'; b[1].src = 't2.png';
anim('i0', a, 2, 1000); anim('i1', b, 1, 1200);
}
function anim(name, imgs, count, msec) {
if(++count >= imgs.length) count = 0;
document.images[name].src = imgs[count].src;
setTimeout(function() { anim(name, imgs, count, msec); }, msec);
}
</script>
</head><body onload="init()">
<p><img src="t2.png" name="i0"><br><img src="t2.png" name="i1"></p>
</body></html>
351Name_Not_Found:02/07/26 10:16 ID:???
クロージャの話、JavaScriptのは見つかりませんでしたが、
Perlのがあったので一応
http://www.harukaze.net/~mishima/perl/faq/faq3j.html#3-14
http://www.geocities.co.jp/SiliconValley-Oakland/1680/xperl/perl_clo.html
352Name_Not_Found:02/07/26 12:22 ID:???
>>351
まあ、JavaScriptの話でクロージャって言葉を使う人はそういないだろうね。
MSはJScriptで関数のネストが可能なことをそもそも説明してないし、
Netscapeは関数のネストが可能なことと、その際に:
・内側の関数は外側の関数の変数や引数を参照できること
・内側の関数が外側の関数の内部でしか参照できないこと
この2点を簡単に説明してるだけ。
ECMA-262-3 にもクロージャに相当する機能について特別な説明はないよ。
個々の機能を総合すれば同じことができるというだけ。
仕様書内に closure という単語が出てはくるけど
正規表現のメカニズムを説明するための内部関数としてだけだ。
353Name_Not_Found:02/07/26 12:51 ID:N60s9EH/
>>352
クロージャという言葉はプログラミング言語において一般的な
概念で別に珍しくはない。だからマニュアル等で説明してなく
ても不思議はない。ただそういう話をしてるときにMSのリファ
レンスが最も詳しいというからどっかに書いてあるのかと思って
質問したまで。MSのリファレンスはIEやJScript固有の機能を
調べる時には使うけどJavaScript言語の一般的な勉強をしようと
思う時には使わない方がいいと思っている。反論あれば聞きたい。

「同じことができる」という言い方もヘン。JavaScriptが持って
いる機能は一般に言われるクロージャそのもの。一般に言われる
クロージャの概念とJavaScript言語の仕様とで本質的に異なる
ことがあるというのならそれも伺いたいところ。
354Name_Not_Found:02/07/26 13:52 ID:???
>>353
や、いいんだけどさ。
ただ、「やってみたらできた」だけの理由で「クロージャになる」って
結論出してる奴多いと思うんだよ。
>>341 とかって「満足な根拠はあるの?」ってことでしょ。
>>352 は「充分納得できるような明解な記述はどこにもないね」という回答。
355Name_Not_Found:02/07/26 14:31 ID:N60s9EH/
>>354
え、だからその動作そのものはECMA-262で明確に規定されて
いるってば。以下ECMA-262 ed.3 13-OCT-99 の節番号でいうと。
13.2節→関数オブジェクトが作られるとき、現在のスコープチェイン
と同じものが[[Scope]]プロパティに格納される。
10.2.3節→関数コードの実行に最しては[[Scope]]プロパティに
格納されているスコープチェインの上に活性オブジェクトをつなげた
状態で始める。
だからECMA-262に準拠しているという以上、クロージャが使える。
356Name_Not_Found:02/07/26 15:03 ID:???
>>355
実際にそうとは限らないけどね。
357Name_Not_Found:02/07/26 15:22 ID:N60s9EH/
>>356
それは(1)準拠していると言いつつ嘘っぱちの処理系があるという意味?
それとも(2)ECMA-262 ed.3 に忠実に実装していてもクロージャが使えない
実装が存在し得るということ?もし(2)だったらなぜそう言えるのか分からん。
説明キボーン。(1)だったらどこの処理系が嘘つきなのか知りたいな。