のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,062,899人
昨日:no data人
今日:
最近の注目
人気の最安値情報

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

    JavaScript覧 / PC版 /
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter

    852 = :

    え?どのブラウザでもそうでしょ

    854 = :

    >>848
    ミスです。治したらfirefoxでは正常に動くのにieで動かなくなりました。何故でしょうか?
    (function() {
    var dir = new Object(), head = document.getElementsByTagName("script")[0];

    dir["./common/js/"] = new Array("foo.js", "bar.js");

    var script;
    for (i in dir) {
    for (var j = 0, len = dir[i].length; j < len; j++) {
    script = document.createElement("script");
    script.setAttribute("type", "text/javascript");
    script.setAttribute("src", i + dir[i][j]);
    head.appendChild(script);
    }
    }
    })();

    855 = :

    script自体はちゃんと作れているようです。
    alert(script.src);で確認しました。
    どうやらappendChildができていないようですが・・・。
    alert(head);もalert(head.appendChild);もちゃんと動きます。

    856 = :

    ぶっちゃけ何がやりたいの?
    そのコード

    857 = :

    for-in は実行順の保証がないので forEach か for が妥当かと。

    859 = :

    >>854
    にわか知識で手を抜こうとして失敗する典型だな。まあ、なにごとも勉強だけど。
    とりあえず、getElementsByTagName("script") のscriptはheadの間違いだろ

    861 = :

    Array.prototype.forEachならECMA 262 5thでも定義されてるし、
    Firefox、Opera9.5、Safari3、Chrome、IE9で使える。
    IE6,7にもArray.prototype.forEachを定義することはできるけど、あまりオススメはしない。
    ちなみに、E4Xの for eachのことならFirefoxだけだ。

    862 = :

    あ、しまった。
    ×head = document.getElementsByTagName("script")[0];
    ◯head = document.getElementsByTagName("head")[0];

    >>857
    そうですね。そういえば少し前に何かの記事でforinの中にfor文作るとすごいパフォーマンスが下がるみたいに書いてあったとうろ覚えしてます。
    やっぱ無駄にfor文増やすより普通に./common/js/***で指定した方がよさそうです。

    みなさん有難うございました。

    863 = :

    なんかの記事っていうのもあれか・・・。これです。
    http://www.hyuki.com/yukiwiki/wiki.cgi?EfficientJavaScript#i11
    こういうのちょくちょく読んでるんですが、当てにできるのかな・・・。

    864 = :

    横からだが他にもおかしいところが山程ある
    (function() {
        var files  = ["foo.js", "bar.js"],
            length = files.length,
            head   = document.getElementsByTagName("head")[0];
        for (var i=0; i < length; i++) {
            var script = document.createElement("script");
            script.setAttribute("type", "text/javascript");
            script.setAttribute("src", "./common/js/" + files[i]);
            head.appendChild(script);
        }
    })();

    書くならこんな感じにする事

    865 = :

    >>864
    jsがfilesになっているのはできるだけ分かりやすい名前を使うっていう事しょうか。
    for(var i = 0, length = files.length; i < length; i++)が普通だと思っていました。外に出した方がいいんですね。

    あと配列のところですが、["foo.js", "bar.js"]よりもnew Array();で作った方がいいという記事をまえに見たのでそうしてました。
    ここの「括弧で生成せずにnewを使う」のところです。高速化より見やすさを重視してという事でしょうか?
    http://journal.mycom.co.jp/news/2009/11/11/015/index.html

    867 = :

    どっちもかわんねえよ

    869 = :

    あーdirを一個に減らしてたから分かりづらかったのかもしれないです・・・。
    (function() {
    var dir = new Object(), head = document.getElementsByTagName("head")[0];

    dir["./"] = new Array("qux.js");
    dir["./common/"] = new Array("baz.js");
    dir["./common/js/"] = new Array("foo.js", "bar.js");

    var script;
    for (i in dir) {
    for (var j = 0, len = dir[i].length; j < len; j++) {
    script = document.createElement("script");
    script.setAttribute("type", "text/javascript");
    script.setAttribute("src", i + dir[i][j]);
    head.appendChild(script);
    }
    }
    })();
    ほんとはこんな感じにディレクトリ毎のファイルをscriptタグのsrcに指定してheadにappendChildするっていう感じでした。
    連投してほんとにすいません。これで終わります・・・。

    870 = :

    >>865
    ひどい日本誤訳だな。グラフよく見てみろ、ほんちょびっとだけリテラルのほうが速いぞ。
    あと、この程度の差は数万回レベルのループとかじゃないと差が出ないので、気にしないのが良いと思うね。
    気になるってんなら仕方ないけど…、病的と言われるレベルだってことは認識してほしいね。
    あとEfficientJavaScriptは良記事だったとは思うけど、元記事が書かれたのは2006年11月だよ。
    チェックしてないけど、古い情報が混ざってるだろうね。

    871 = :

    命名規則なんて好きにしろ

    後、その記事おかしくね?
    リテラルの方が早いんだが…

    873 = :

    Good Parts、なんだかんだでクロックフォード御大の好みがにじみ出てるからね・・・

    先日出た「ハイパフォーマンスJavaScript」は、
    これまで散逸しがちだった「突っこんだ話」が1冊にまとまってて便利だと思ったよ
    さすがに原著の出版が2010年3月なので、ブラウザ関連の話は古びてるものも出てきてたけれど・・・
    NCZ様々だなー

    874 = :

    リテラルの方が(文法的に)いいと推奨しているサイトがありますが、
    理由がわかりませんでした。どうしてでしょう?

    876 = :

    つ【Object.create】

    877 = :

    var xx = 0;
    window.onload = function(){
    var img = new Image();
    img.onerror = function(){xx = 1;};
    img.src = "x.jpeg";
    }
    IEだとxxに1が入るんですけど、firefox、opera、chromeなどは全て代入処理が行われませんでした。
    どうしてでしょうか?

    879 = :

    createみたいなメソッドの中にnewする部分を閉じ込めて通常コード
    には出ないようにするんでないの。でもそれならコンストラクタを
    newつけずに呼んだらその中で検出して対処するんだっていいと思って
    いるけどね。

    880 = :

    >>879
    > newつけずに呼んだらその中で検出して対処するんだっていいと思って
    > いるけどね。

    それ、どうやるの?

    function create(){this.x = 'X'}
    var y = {};
    y.c = create;
    y.c()

    とやったとき、newつけていないことを検出できる?

    881 = :

    >>874
    実行時にエラーチェックできるから。

    882 = :

    >>880
    わざわざ他のもののメソッドにしたらそりゃ分からんだろうけど。
    そもそもコンストラクタとして使うものにcreateとかいう名前つける?
    小文字で始める?そういうコード普通に書いているというのなら私には何の
    アイデアもないです。

    884 = :

    >>880,882
    >>876

    885 = :

    今すぐES5で書けという意味かな…それでいいの?

    886 = :

    >>878

    >>875
    > コンストラクタ関数をnewを付けずに実行するとグロスコが汚れる
    > これを回避するためにはnewを使わないことだ
    てことなら、コンストラクタ内でnewするのはOKってことだから、

    var Constructor = function() {
    if (!(this instanceof Constructor)) {return new Constructor();}
    }
    でいいんじゃない?

    888 = :

    >>886-887
    別にvarにしなくても普通にfunctionのままで予防的に/**/の行を追加とかは?
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <html><head>
    <title>sample</title>
    </head>
    <body>
    <pre><script type="text/javascript">
    function Counter() {
    if(!(this instanceof Counter)) { return new Counter(); } /**/
    this.x = 1;
    this.add = function(d) { return this.x += d; }
    }
    var c1 = new Counter();
    var c2 = Counter();
    var c3 = Counter();
    document.writeln(c1.add(1)); document.writeln(c1.add(1))
    document.writeln(c2.add(1)); document.writeln(c2.add(1));
    document.writeln(c3.add(1)); document.writeln(c3.add(1));
    </script></pre>
    </body>
    </html>

    889 = :

    >>887
    たとえば組み込みのObjectコンストラクタだと、
    newするときに渡す値によって使われるコンストラクタが違うので、バグの温床になる

    var o1 = new Object();
    o1.constructor // Object
    o1.toFixed // undefined

    var o2 = new Object(1);
    o2.constructor // Number
    o2.toFixed // 存在する

    Objectコンストラクタ以外でも、上にあるようなグローバルスコープの問題とかがあるから
    リテラルで済ませられるときにはnewを使うなというのは正しいと思う

    890 = :

    >>888
    おまえはいったい何が言いたいんだ

    893 = :

    日本でもしものサマータイム導入に備えて今のうちにコード対応したいのですが
    サマータイムに対応できるライブラリってありませんか?

    897 = :

    特定の月の最終日曜日(今月なら27日)を取得する方法が分かりません
    単純に月の日数を取得して日曜日かどうか判断していく方法しか思いつきませんでした
    コードは確認してないけどこんな感じですか?
    もっとかっこいいアルゴリズムを教えて欲しいです

    year = 2011;
    month = 3;
    lastday = new Date(year, month+1, 0).getDate();
    for (var i=lastday; 1<lastday; lastday--) {
    if (0 == lastday.getDay()) break;
    }
    alert("最終日曜日は"+lastday+"日です");

    898 = :

    var year = 2011;
    var month = 3;
    var _D = new Date(year, month, 0);
    //"最終日曜日は"+(_D.getDate() - _D.getDay())+"日です"

    900 = :

    >>897
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <html><head>
    <title>sample</title>
    <script type="text/javascript">
    function calc() {
    var y = parseInt(document.getElementById('t0').value, 10);
    var m = parseInt(document.getElementById('t1').value, 10);
    var d = (m<12) ? new Date(y, m, 1) : new Date(y+1, 0, 1);
    var x = d.getDay(); if(x == 0) { x = 7; }
    var s = new Date(d.getTime()-x*86400000);
    document.getElementById('t2').value = String(s.getDate());
    }
    </script>
    </head>
    <body>
    <div>Year:<input type="text" id="t0"> Month:<input type="text" id="t1">
    <button type="button" onclick="calc()">Calc</button>
    Last Sunday:<input type="text" id="t2" readonly></div>
    </body>
    </html>


    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

    類似してるかもしれないスレッド


    トップメニューへ / →のくす牧場書庫について