JavaScript の質問用スレッド vol.11
336 :
Name_Not_Found:
>>335 だから、function() {...}の中から外側の変数を参照している場合、その変数
への参照が後からでもできるように手当てされるのです。こういうのをクロージャ
と言います。ただし参照できるのはあくまでも変数でして、thisっていうのは変数
ではない(オブジェクトを表す疑変数というべきか)。なのでthis1への代入が必要
なんですよね。JavaScriptって結構奥が深いでしょ。
>>336 なるほど、深いですね。
勉強になりました。
ところで、そういう知識って一体どこで習得してるんですか?
ECMAScriptの仕様書とかに載ってます?
>>337 JavaScript解説本とかはとりあえずいくつか読みましたけどね。
もちろんECMA-262には仕様書なんだから載っていると思うけど、
仕様書って読みづらいんですよね。
>>338 さっきのタイマーオブジェクトのコードで、さらに配列を引数にしてみても、ちゃんと動きました。
なんかもう、Hello Worldが表示できたときと同じくらい感激です!
細かく解説してくれた上にJavaScriptの視野まで広げてもらって、
本当に有難うございました。
>>337 マイクロソフトのリファレンスが最も詳しい。
341 :
Name_Not_Found:02/07/25 19:09 ID:yNoqFQbU
>>340 オブジェクトの仕様とかは分かるけど、関数がクロージャになるだとか
thisの意味だとかはMSのサイトのどこに載っているの?
>>342 「thisステートメント」とか書いてある怪しいやつなw
クロージャについての記述はぜひ読みたいのでURLきぼんぬ。
fagaae
o
345 :
ミトコンドリア:02/07/25 23:49 ID:XvftP0Mc
すいません。教えて欲しいのですが、
「2〜3枚の絵をアニメーションとして順番に表示させるようにする」
っは出来るのですが、
「一つの画面上で別の複数のアニメーションを表示させる」になると、エラーが出っ放しでわかりません…
JavaScriptでしたいのです。教えてください
>>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" >
っです。これでアップしたところ一つ目の絵も動かなくなりました。
>>347 呼び出す関数名「anime()」がだぶってるから
>>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] を変更
頭の悪そうなスクリプトですまん。
350 :
Name_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>
>>351 まあ、JavaScriptの話でクロージャって言葉を使う人はそういないだろうね。
MSはJScriptで関数のネストが可能なことをそもそも説明してないし、
Netscapeは関数のネストが可能なことと、その際に:
・内側の関数は外側の関数の変数や引数を参照できること
・内側の関数が外側の関数の内部でしか参照できないこと
この2点を簡単に説明してるだけ。
ECMA-262-3 にもクロージャに相当する機能について特別な説明はないよ。
個々の機能を総合すれば同じことができるというだけ。
仕様書内に closure という単語が出てはくるけど
正規表現のメカニズムを説明するための内部関数としてだけだ。
353 :
Name_Not_Found:02/07/26 12:51 ID:N60s9EH/
>>352 クロージャという言葉はプログラミング言語において一般的な
概念で別に珍しくはない。だからマニュアル等で説明してなく
ても不思議はない。ただそういう話をしてるときにMSのリファ
レンスが最も詳しいというからどっかに書いてあるのかと思って
質問したまで。MSのリファレンスはIEやJScript固有の機能を
調べる時には使うけどJavaScript言語の一般的な勉強をしようと
思う時には使わない方がいいと思っている。反論あれば聞きたい。
「同じことができる」という言い方もヘン。JavaScriptが持って
いる機能は一般に言われるクロージャそのもの。一般に言われる
クロージャの概念とJavaScript言語の仕様とで本質的に異なる
ことがあるというのならそれも伺いたいところ。
>>353 や、いいんだけどさ。
ただ、「やってみたらできた」だけの理由で「クロージャになる」って
結論出してる奴多いと思うんだよ。
>>341 とかって「満足な根拠はあるの?」ってことでしょ。
>>352 は「充分納得できるような明解な記述はどこにもないね」という回答。
355 :
Name_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に準拠しているという以上、クロージャが使える。
357 :
Name_Not_Found:02/07/26 15:22 ID:N60s9EH/
>>356 それは(1)準拠していると言いつつ嘘っぱちの処理系があるという意味?
それとも(2)ECMA-262 ed.3 に忠実に実装していてもクロージャが使えない
実装が存在し得るということ?もし(2)だったらなぜそう言えるのか分からん。
説明キボーン。(1)だったらどこの処理系が嘘つきなのか知りたいな。