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

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

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

    452 = 442 :

    >>449
    スコープ内のどこで変数宣言しても全部最初に定義される。例えば

    var a = 'hoge';
    (function(){
      console.log(a); // 2. undefinedになり
      var a = 'fuga'; // 1. 最初にこの宣言だけ行われ(3. 代入はこの行で実行)
    })();

    こんな感じで
    なので、そのスコープ内で宣言される全ての変数を把握していないと、おや?ということになる
    ひとりで書いてれば気にならんけど、他人のコードをメンテする場合とか、結構イラッとする

    スコープの最初に書き直されるのはどうかと思うけど
    今いじってるスコープで宣言される変数の一覧を出すとか、色つけてくれたりしたら便利だと思う

    453 = :

    警告を出すだけならJSLintとかの仕事だ
    それを機械的に直したいっていうのはちょっとニッチすぎるな

    454 = :

    「var 」を全部「let 」に置換すればいいよ
    letなら(まともに実装してれば)巻き上げないから動けば気にしなくていいし、
    動かなければあんまりいい設計じゃないってことで動くよう最小限書き直せばいい
    それで妥協するのでもいいと思うよ

    455 = :

    >>439

    > これを試してみましたが、番号でソートすると
    > 1,11,12,...,2,21,22,...

    はい知っています。でも答えは書きません。
    正確にはChromeでは数字ではなく数値として
    扱うようで数値での並び順になっています。

    ヒントは>>354とその付近で既に示しています。
    あとは自分で頑張りましょう。

    456 = :

    ダメな先輩きたー
    >>349が責任とってお相手して差し上げろよww

    457 = :

    >>452
    そんな挙動するのか、ありがとう。
    とりあえず、他人のコード把握したいなら、さくらエディタでのgrepで
    ~.jsファイルに対してvarで抜き出したいいんじゃな?

    458 = :

    varを関数の上の方に持ってくるべきという主張にはあまり賛同できないな。

    varを関数の途中に持ってくるのは、この変数はここから使います。
    という意思表示に現れ。

    それを上に持ってくるのは、自分の考えをJavaScriptという
    言語仕様だけのためにねじ曲げられているということ。
    varを関数に途中に持ってくるのは理由があってやっているが
    頭に持ってくるのは理由がない。

    こういうのは、関数内でvarで宣言するよりも前に
    変数が使用されていたらjshintなどで警告出させるべきだが
    さてそんなオプションあったっけ?

    もう一つ、変数の再定義をした時にも警告を出す必要があるが
    jshintであればデフォルトでONだったはず。

    459 = :

    > こういうのは、関数内でvarで宣言するよりも前に
    > 変数が使用されていたらjshintなどで警告出させるべきだが
    > さてそんなオプションあったっけ?

    latedefでいけるかな?
    ちょっと手元に環境がないので試せない。

    460 = :

    >>458
    そりゃそうだ
    自分もどこでもいいと思うよ

    他の言語から入ってきた人やJS初心者とか
    色んな人が触るコードでいろいろコーディングスタイル厳しく統一していったら
    最初にまとめて書いておこうねってなるとは思うけど
    その程度のことだと思う

    461 = :

    宣言より上の操作でエラーが欲しければlet使えばいい。
    宣言前の使用は実行時エラーになるが、
    二重宣言とかはコンパイル時エラーで出してくれる。

    462 = :

    >>460
    まぁ自分しか見ない・編集しないコードであれば好きにやりゃいいけど
    他人が読む可能性があるコードでオレオレコーディングはやめてくれ

    463 = :

    俺俺コーディング??
    タブ流とスペース流みたいなものでどっちが正しいとかないと思うが
    何言ってんだか……

    464 = :

    varとか宣言がブロックスコープになる言語使ってきた人じゃないのなら混乱もないだろうし、
    >>458のメリットも捨てがたい

    そもそも元々柔軟さをとってそういう仕様になったんだから
    よっぽどの場合を除き、仕様に則ってコーディングするのが普通じゃない?
    あえてJSのスタイルに逆らうほうがオレオレだと思うけど

    465 = :

    >>463
    え、JavaScript に関して言えば別だろ

    466 = :

    JSは裾野が広すぎてスタンダードが決めづらいだろう
    JsDocみたいな提唱はあるけど

    467 = :

    自分が作ったコードをあとで馬鹿たれが編集するかもしれないって考えてコーディングするのがプロとしての勤めじゃないの?
    なんでトラブルの原因になるかもしれないものをわざわざ残すような書き方をするのか

    468 = :

    >>460
    > 色んな人が触るコードでいろいろコーディングスタイル厳しく統一していったら
    > 最初にまとめて書いておこうねってなるとは思うけど

    いやしないほうがいいと言ってるんだよ。

    コーディングスタイルに関してはjshint等で設定をつめて
    それに従わせるだけだからあえて説明する必要もない。
    (エラーの意味ぐらい自分で調べろというだけ)

    変数の巻き上げが起きない別の言語の話だが、中途で入ってきた人が
    前の会社の癖(COBOLらしいが)で変数を関数の上で全部宣言していたのよ。

    その時は、まあそんなスタイルもありかと思ったが、まあこれがうちの(俺の)
    やり方だからってことで変数を使用する所で宣言するように直していったら
    コードがかなり見やすくなった。

    理由としてはこんな所。
    ・変数を利用する範囲が小さいから変数名は短くても十分
    変数を冒頭に置くと関数内で被らないようにしないといけないから
    分かりやすくということで、長い名前になりがち。
    変数を利用する範囲が小さいならば、コード見れば何の値なのかすぐに分かる。

    ・変数の宣言と初期化処理を二重に書かなくて済む。
    コントロールブレイクっていうCOBOLでのコードパターンがあるんだが
    ループ中にブレイクしたら変数初期化をするなんてコードがあるんだよね。
    ループの中だけでしか使わない変数なら、その場で宣言して代入すれば良いのにって思う。

    ・変数に代入した後、その値を変える必要が少なくなった。
    宣言と使用箇所が分かれてると必然的に変数の再代入が必要になる。
    再代入はするべきではないって話は、関数型言語を知らばわかる。
    ここもテストに出るので勉強しておくようにw

    469 = :

    宣言を頭に持ってくるのは気持ちの問題でしかない
    だってどこに書いても頭に持ってきたかのように振る舞うのだからね
    あえて頭に書いてもロジック的なメリットはないし、同じことだ
    それならどこにでも書けるというのを活かした方が正しい
    少なくとも頭にまとめるべきというのは正しくない
    現にそういうチェックはJSLintでもされてない

    470 = :

    >>468
    静的方面から入った人は頭を見れば全部わかるみたいに考える人が多いから
    そこの文化に従う事になればしょうがないことだと思うよ

    471 = :

    >だってどこに書いても頭に持ってきたかのように振る舞うのだからね
    >あえて頭に書いてもロジック的なメリットはないし、同じことだ

    え、JS素人ですか

    472 = :

    >>461
    > 宣言より上の操作でエラーが欲しければlet使えばいい。

    そのとおりだが、letはIE10以上でないと対応していないという
    現実的な問題がある。

    http://msdn.microsoft.com/en-us/library/ie/s4esdbwz(v=vs.94).aspx

    473 = :

    >>471
    素人はお前だボケ
    それとも流れが読めないのか?

    474 = :

    >>470
    > 静的方面から入った人は頭を見れば全部わかるみたいに考える人が多いから

    その言い方じゃ、静的言語を知らないとしか思えないぞ。

    なぜなら静的言語で関数の頭でしか宣言できない言語は
    ごくわずかだからだ。

    ちゃんとどっちも勉強しておけよ。
    全くどいつもこいつも(このスレだけの話じゃない)

    475 = :

    ここ1年IEを考えたことなんて数回しか無い。
    できるだけ意図的に無視してるな。

    476 = :

    >>473
    へー、自分以外が編集したときに宣言の巻き上げで問題を起こす可能性が0なのかー
    さすがプロ(笑)

    477 = :

    >>474
    だれも出来ないなんて言ってないよ
    そういう文化があるし、そういうコードがJavaでもC++でも大多数
    知らないの???

    478 = :

    >>474
    頭かてーな
    JavaScriptかどうかに関わらず言語の仕様に合わせろって言ってるだけだろ

    480 = :

    >>476
    0だよ

    function f(){
    var x
    ...
    x = hoge



    function f(){
    ...
    var x = hoge

    はロジック的に全くの等価
    反例があるのならよろしくw

    481 = :

    >>480
    その…の部分で問題が起きるかもしれないんだろ・・・
    もしかして変数の巻き上げって現象を知らないのか?

    482 = :

    リロードしたら伸びすぎワロタ

    483 = :

    >>481
    どう問題が起きるのか書いてくれないかな?
    こっちアホだからわからんのよ?

    それと変数じゃなくて、宣言の巻き上げでしょ?

    484 = :

    なつかしー展開。
    一昔前は、何人ROMってたんだよってくらい
    突然勢い伸びてた時期もあったなー。

    485 = :

    >>477
    > そういう文化があるし、そういうコードがJavaでもC++でも大多数

    大多数であるというデータがあるなら教えてよ。

    少なくともJavaやC++で変数の宣言場所は自由だし、
    俺の知る限りそれを守ってるプロジェクトなんか知らない。

    上の方で宣言するしかない言語は知っているが、
    どこでも宣言できるのに、上の方で宣言しろなんて文化は聞いたことがない。

    486 = :

    >>483
    >>452

    487 = :

    >>468
    >変数を冒頭に置くと関数内で被らないようにしないといけないから

    スコープ内のどこでも、かぶっちゃいけないと思うの
    多重定義は見逃してもらっているだけだと思ってる


    >>477
    まるで世界中の物を見てきたかのような口ぶりで
    軽々しく「~が大多数」とか言う人のことは話半分で聞いておけ
    って爺ちゃんが言ってた

    488 = :

    >>486

    var a = 'hoge';
    (function(){
      console.log(a); // 2. undefinedになり
      var a = 'fuga'; // 1. 最初にこの宣言だけ行われ(3. 代入はこの行で実行)
    })();

    これと

    var a = 'hoge';
    (function(){
      var a;
      console.log(a); // 2. undefinedになり
      a = 'fuga'; // 1. 最初にこの宣言だけ行われ(3. 代入はこの行で実行)
    })();

    これは等価だと思うが?

    489 = :

    >>487
    > スコープ内のどこでも、かぶっちゃいけないと思うの

    いやいや、そういう話ではなくてね。

    まず宣言の巻き上げが起きない
    JavaScript以外の言語の話ね。

    例はJavaScriptで書くけどw

    function foo() {
     for(let i = 0; i < 100; i++) {
      console.log(i);
     }
     for(let i = 0; i < 100; i++) {
      console.log(i);
     }
    }

    こういうコードで、変数定義を関数の上の方に
    持ってくるとかぶっちゃうわけよ。

    スコープ内でかぶるとかいう話ではなく、
    ブロックスコープが、関数スコープに
    広がってしまうからかぶっちゃうのよ。

    490 = :

    >>486
    これは結局こう書かないと行けないねってことで
    >>488の通りだと思うけど

    var a = 'hoge';
    (function(){
      var a = 'fuga';
      console.log(a);
    })();

    491 = :

    letを使うのは有用だけど、ここはESスレじゃないし
    >>452のように、エディタやIDEでなんとかするのが建設的な気がする

    とりあえず、sublimeのプラグインで書いてみようかと思うんだが
    やっぱ色つけるのが良いですかね?他になにか案ある?

    492 = :

    >>489
    なんでJSすれでJS以外の言語仕様の話持ち出すの?

    493 = :

    > >>452のように、エディタやIDEでなんとかするのが建設的な気がする

    jshintでやれといったじゃん
    人のはないちゃんと聞けよw

    494 = :

    Web製作管理板とは言え、最近はWebアプリというものもあるし
    最先端技術を蔑ろにする方が現実を見てないと思うな
    もうIEガーはいいよ

    495 = :

    >>492
    変数は使用する所で宣言した方がいいという
    話をしているだけですが、

    他の言語の経験は、JavaScriptには当てはまらないとでも言いますか?

    496 = :

    嫌だよめんどくせえ

    497 = :

    >>494
    「IEガー」がいい理由って何?

    498 = :

    >>492
    ア・ス・ペ

    >>495
    JavaScriptスレでJavaScriptの変数の宣言場所の話をしてるのですが・・・
    他の言語での変数宣言の場所の話は総合スレかなんかでどうぞ

    499 = :

    >>498
    えぇ、ですからJavaScriptの変数の宣言場所の話をしていますよ?

    500 = :

    それではEcmaScriptスレの意見を伺ってみましょう。
    http://toro.2ch.net/test/read.cgi/tech/1325448978/319-331
    うーん、やっぱりここが頼りみたいですよ。


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

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


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