+ JavaScript の質問用スレッド vol.24 +

このエントリーをはてなブックマークに追加
947Name_Not_Found:04/01/26 05:50 ID:???
Windows の Active DeskTop でも使えそうだね。
948Name_Not_Found:04/01/26 08:38 ID:???
>>939
「構文は」ちっとも間違っていない。関数というのはオブジェクトだし
function f() { ... }
とやって関数を定義するのは
var f = function() { ... }
とやって定義するのと同じことだし、オブジェクトにプロパティをつける
ことはいくらでもできるから。ただ、gというプロパティが作られるという
のは当時の処理系固有の動作と思われ。
949Name_Not_Found:04/01/26 09:00 ID:???
えー、次スレは975越えたら立てますね。テンプレは同じでいいね?
950Name_Not_Found:04/01/26 09:02 ID:???
>>939
JavaScript1.2は、関数を入れ子にできるようにした最初のバージョンだったから
当時はそういう実装でそのへんやりくりしていたものと思われる。
でもあくまで非公開仕様であり常に廃止・修正予定、みたいな。

>>948
> 当時の処理系固有の動作
JavaScript1.3/1.5もf.xやf.gというプロパティは作られる。
>>928 のコードだと f.g() で f.x がアラート表示される模様。
まあ、やはり「処理系固有の動作」なのでどうでもいいことだが。
# 1.3と1.5でも若干挙動が違うな。
951Name_Not_Found:04/01/26 10:48 ID:okT2tJ7h
一番後ろの配列を削除しているのに、pushすると次の添え字のところに値が入ってしまいます。
a = new Array(1,2,3);
delete(a[2]); // aの最後のa[2]を削除
a.push(9); // a[2]にではなく、a[3]に9が入ってしまう

a[2]を削除してa[0]、a[1]だけになっているはずなのに、pushするとa[3]に値が
入ってしまいます。たしかに、deleteの後のa.lengthは3のままなのですが、
こんなもんなんでしょうか?

これもJavaScriptのバージョンが変わると変わってしまうのでしょうか?
952Name_Not_Found:04/01/26 11:26 ID:???
>>951
そんなもんです。 delete は Array オブジェクトの length を変更しません。
push は length を参照するのでそういう動作になります。
末尾を削除して長さも変更したいなら、 pop を使いましょう。
953Name_Not_Found:04/01/26 11:40 ID:???
frames[n]のnは変数にできないのでしょうか?


for(i=0; i<=5; i++)
{
if(document.forms[vInter].elements[i].checked == true)
{
alert(i);
setTimeout("parent.Bottom.frames[i].location.href = 'hoge.html'",iTIME);
iTIME = iTIME + iTime;
}
}

これだとエラーになってしまいます(IE6)


6行目を↓にするとエラーは出ません
setTimeout("parent.Bottom.フレーム名.location.href = 'hoge.html'",iTIME);
setTimeout("parent.Bottom.frames[0].location.href = 'hoge.html'",iTIME);
parent.Bottom.frames[i].location.href = 'hoge.html';
954Name_Not_Found:04/01/26 11:48 ID:???
>>953
"parent.Bottom.frames["+i+"].location.href = 'hoge.html'"
955Name_Not_Found:04/01/26 11:57 ID:???
>>954
そういう事だったんですね
ありがとうございます
956Name_Not_Found:04/01/26 12:04 ID:5sWPkHik
こんにちは。
ホームページに縦のフレームを使っています。
左には、メニューと言う感じになっています。
そこで、左フレームにあるメニューの1つの項目を
クリックしたら、ちょっと小さなサブメニュー?をクリックした項目の下に
表示したいんですが、どうも引っかかりません。
どうかよろしくお願いします。
957Name_Not_Found:04/01/26 12:08 ID:???
>>956
フレーム云々はあまりこの問題に関係ないと思う

http://www.google.co.jp/ で検索
JavaScript 階層 メニュー
958Name_Not_Found:04/01/26 12:13 ID:5sWPkHik
そういうのを階層って言うんですね。
ありがとうございます。
まさに、実現したかったことでした。
わかりやすい解答ありがとうございました。
959928:04/01/26 12:13 ID:???
>>948, >>950
ありがとうございます。
いま for in で調べてみたら、確かに Mozilla では f.x, f.g というプロパティが
できていました。IE ではできていませんでしたが。

しかしこの Mozilla の JavaScript の挙動は怖い気がします。f に外部からプロパティ
x, g を付加した時、内部変数と名前空間が衝突してしまう気がします。
今試したところ、問題は起こらないようでしたが。

f.g = "foo";
f();//この関数の実行後に、f.g が書き換わっていないか試したい。
alert(f.g);//"foo"と表示された。

でもやはり、余計なプロパティを生成しない IE の方が使い勝手が良いと思います。
f のプロパティを for in で処理しようとすると、内部変数と同じ名前のプロパティが
意図せずに生成されてしまっているので、邪魔だと思います。
960928:04/01/26 12:15 ID:???
ところで、この明らかに実装依存と思われる現象に私がこだわったのには理由が
あります。>>929 の 3.の現象が気になったのです。つまり、
g() の定義を、function g() とした場合と、 var g = function() とした場合とで
挙動が違ったことです。Mozilla のみですが。

function g() の場合
alert(f.g); // "function g(){ alert(x); }" を表示
f.g()//undefined

var g = function() の場合
alert(f.g);//undefined
f.g()//エラー f.g is not a function

この挙動は f() の実行の前後で変わりませんでした。

些細なことですが、function g() と var g = function() とで挙動が異なるのは
初めての経験でした。自分の見落としていたポイントがあるような気がしたのです。

まあ、function g() とした場合に、コンパイル時に g の値が定まっているのは
当然かもしれませんが。
961Name_Not_Found:04/01/26 12:43 ID:???
>>960
> 些細なことですが、function g() と var g = function() とで挙動が異なるのは
> 初めて

( ´,_ゝ`)プッ
だいじょぶ?
最初から勉強しなおしたほうがいいよ
962Name_Not_Found:04/01/26 13:04 ID:???
>>960
ぜーんせん分からない。いったいなんで「f.g()」なんていう呼び出しを
したいわけ?オブジェクト作るなら普通にコンストラクタとしてfを書けば
いいと思うんだけど。
963Name_Not_Found:04/01/26 13:13 ID:okT2tJ7h
>>952
ありがとうございます。
deleteはArrayオブジェクトのlengthを変更しないんですね。
また、pushはlengthを参照して動いているんですね。知りませんでした。

でもJavaScriptのことだからいずれ変わる可能性はありますよね?
964Name_Not_Found:04/01/26 13:16 ID:???
いいえ。変わりません
965Name_Not_Found:04/01/26 13:29 ID:???
>>962
別に f.g() という呼び出しの実現が目的でやってることじゃないと思われ。
966928:04/01/26 13:39 ID:???
>>961
確かに勉強しなおしたほうがいいと思います。
割と最近まで、
function g() (FunctionDeclaration) は
var g = function() (FunctionExpression) の syntactic sugar だと
誤解していましたので。

この二つの構文で挙動が違うのは、他にどのような場合が考えられるのでしょうか?
>>928の場合、どちらも g は f のローカル変数となる点では変わらないです。
再帰などで影響があるかと思いましたが、そうでもないようです。
(影響があるのは無名関数に名前をつけた場合ですよね?)
http://www.interq.or.jp/student/exeal/dss/ejs/1/2.html

>>962
f.g() という呼び出しをしたいわけではありません。JavaScriptの動作原理を
理解するために、この現象を考察することが助けにならないかと考えたのです。

もう少しいうと、
・JavaScript 1.2 のスコープ・チェインの仕様と、現在の仕様の違い
・FunctionDeclaration と FunctionExpression の挙動の違い
をきちんと整理したいと考えています。
967Name_Not_Found:04/01/26 13:52 ID:???
> しかしこの Mozilla の JavaScript の挙動は怖い気がします。f に外部からプロパティ
> x, g を付加した時、内部変数と名前空間が衝突してしまう気がします。
JavaScript1.3(NN4.0x, 4.x) だと、実際に衝突してくれたりするので
そのへんに対応させる場合は注意が必要かもしれません。

ECMAScript仕様とか読むと出てくるんだけど、Activation Object ってわかる?
関数の実行時にスコープチェーンの一番近いところに入ってくる(つまり真っ先に参照される)
仮引数や入れ子の宣言された関数、ローカル変数をプロパティに持つオブジェクトなんだけど
JavaScript1.2/1.3では恐らくFunctionオブジェクトにこの役割をさせていると思われる。

>FunctionDeclaration と FunctionExpression の挙動の違い
これは単純に評価されるタイミングが違う。
968Name_Not_Found:04/01/26 13:52 ID:???
delete
969928:04/01/26 14:14 ID:???
>>967
> JavaScript1.3(NN4.0x, 4.x) だと、実際に衝突してくれたりするので

Netscape 4.0x, 4.x は、野心的だが、非常に実装が汚いと聞きました。
それは <layer> タグなどのことでしたが、JavaScript 1.3 もそうだったのですねえ。

> ECMAScript仕様とか読むと出てくるんだけど、Activation Object ってわかる?

O'Reilly のサイ本の Call オブジェクトのことですね。

> JavaScript1.2/1.3では恐らくFunctionオブジェクトにこの役割をさせていると思われる。

やはりそうでしたか。そういう実装だったなら、Closureオブジェクトが役に立った
でしょうね。
Closure オブジェクトが創設、廃止された理由を知りたかったのですが、このあたりが
鍵のように思います。


> >FunctionDeclaration と FunctionExpression の挙動の違い
> これは単純に評価されるタイミングが違う。

このタイミングの違いが、はっきりと大きな違いになるケースを知りたかったのです。
コーディングルールとして、原則として FunctionExpression を用いるようにして
おりましたので。

Activation オブジェクトが Function オブジェクトそのものだったなら、何か
影響が出そうです。
現代のブラウザだとどうなのだろう?
970Name_Not_Found:04/01/26 14:18 ID:???
>>967
うーん、分からないんだけど、Functionオブジェクトにそれをさせると
再帰のときに困ったりしないのかなあ。

あとそもそも、問題が起きるのは関数オブジェクトにプロパティを書き
込む場合なわけで、普通そういう危ないことはしないと思うし、JS1.5から
はちゃんとECMAに準拠してるわけでしょ。まあ探求するのはいいんだけど。

ECMA的には、var f = function(...) { ... }; と funciton f(...) {... }
は同じことだよね。規格を見るとそう読めるんだけど(何か読み落してる?)
971Name_Not_Found:04/01/26 14:29 ID:???
>>969
> JavaScript 1.3 もそうだったのですねえ。
まあ関数の入れ子が標準化される前の仕様だから。

> このタイミングの違いが、はっきりと大きな違いになるケース
FunctionDeclarationはコード評価に先だって評価されるから
先頭に書いても末尾に書いてもコード中のあらゆるところで参照できる。
FunctionExpressionは式評価のタイミングで評価され、評価前は参照することができない。
こんなんで参考になるかなぁ。

f();
var f=funciton(){ alert('fuga') }
function f () { alert('hoge') }
f();
972Name_Not_Found:04/01/26 14:34 ID:???
なるほど、名前fが利用可能になる時点が違うのか、納得しますた。
973Name_Not_Found:04/01/26 14:42 ID:???
x.js のなかで y.js で定義された f という関数を使いたいときはどうやれば
呼び出せるのですか?
974Name_Not_Found:04/01/26 14:48 ID:???
>>973
y.js を先に読み込んでれば、普通に f() で呼び出せるだろ。
975928:04/01/26 14:54 ID:???
>>971
なんと、こんなシンプルなところを今まで理解していなかったとは…。
ありがとうございました。

ところで、これ↓は動きましたが、
<script type='text/javascript'>
 f()
 function f(){ alert("foo!"); };
</script>

こちら↓は動きませんでした。(f is not defined)
<script type='text/javascript'>
 f()
</script>
<script type='text/javascript'>
 function f(){ alert("foo!"); };
</script>

こういう仕様なのですねえ。
976Name_Not_Found:04/01/26 14:59 ID:???
>>975
それはscript要素毎にコード評価を行っているから。
どっちかというとブラウザとかHTMLの仕様。
977Name_Not_Found:04/01/26 15:02 ID:???
>>974
htmlファイルからの javascript の読み込み方しか知らないんです。
.jsファイルから.jsファイルを読み込むにはどうすればいいのですか?
978Name_Not_Found:04/01/26 15:02 ID:???
979Name_Not_Found:04/01/26 15:09 ID:???
>>977
htmlで使うjavascriptじゃないの?

>>978
乙。
980Name_Not_Found:04/01/26 15:10 ID:???
>>977
.js ファイルから .js ファイルを読み込むなんてことはできないけど、

<script type='text/javascript' src='y.js'></script>
<script type='text/javascript' src='x.js'></script>

htmlにこう書けば x.js からは y.js が使える。
981Name_Not_Found:04/01/26 15:12 ID:???
>>978
982Name_Not_Found:04/01/26 15:20 ID:???
>>980
> .js ファイルから .js ファイルを読み込むなんてことはできないけど、
そうなのですか。
ちょっと、設計を考え直します。
983Name_Not_Found:04/01/26 15:58 ID:???
そんじゃ埋めに入るか
984Name_Not_Found:04/01/26 16:00 ID:???
javascript:confirm('記念カキコしていい?')
985Name_Not_Found:04/01/26 18:02 ID:???
>>984
良いんじゃネーノ985
986Name_Not_Found:04/01/26 18:06 ID:???
987Name_Not_Found:04/01/27 12:59 ID:???
( ´ー`)y―┛~~
988Name_Not_Found:04/01/27 14:24 ID:???
うめ
989Name_Not_Found:04/01/27 18:18 ID:???
たて
990Name_Not_Found:04/01/27 18:19 ID:???
まっせ
991Name_Not_Found:04/01/27 18:51 ID:???
Umetaterupo
992Name_Not_Found:04/01/27 20:19 ID:???
みんなで埋める、JSスレ
993Name_Not_Found:04/01/27 23:19 ID:jvGsmwlI
梅松
994Name_Not_Found:04/01/28 00:06 ID:???
埋めながらageるな!!!
995Name_Not_Found:04/01/28 00:17 ID:???
埋めは影の戦い
996Name_Not_Found
+ JavaScript の質問用スレッド vol.25 +
ttp://pc2.2ch.net/test/read.cgi/hp/1075096787/l50