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

    私的良スレ書庫

    不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
    ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

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

    JavaScript スレッド一覧へ / JavaScript とは? / 携帯版 / dat(gz)で取得 / トップメニュー
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    レスフィルター : (試験中)
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
    901 : Name_Not - 2014/05/26(月) 20:34:57.29 ID:??? (+17,-24,-101)
    >>899
    めんどくせぇやつだな。
    関数直下以外はブロックスコープだよ。

    関数スコープはなくなったわけじゃないし、
    letを使わない限り、関数スコープ。

    ES5では関数スコープしかなくて、
    ES6で新たにブロックスコープという概念が追加されたの。
    902 : Name_Not - 2014/05/26(月) 20:37:58.19 ID:??? (+53,-29,-139)
    >>898
    > letを使わない限り変数は関数スコープとなり、ブロックスコープはオプションと考えられる。
    お手すきであれば教えて頂きたいのですが、>>887の「if文内での関数宣言がブロックスコープ」はES6にはない仕様で合ってるでしょうか
    http://people.mozilla.org/~jorendorff/es6-draft.html から該当仕様を探そうとしていますが、見つけることが出来ず
    自分の読解力がないだけなのか、本当に存在しないのか判断出来ませんでした
    903 : Name_Not - 2014/05/26(月) 20:41:59.11 ID:??? (+75,+29,-93)
    >>902
    はいそうです。

    関数定義はブロックでやってはいけません。

    そもそも、動的に定義する必要がないものは静的に定義するのが良いコードなので、
    関数定義は(必要がない限り)function文で行うものです。function式で行うべきじゃありません。

    ifなどのブロックは実行時に処理されるかどうか決まるので本質的に動的です。
    だから静的に行うべき関数定義は、静的に、ゆえに関数スコープでやるべきなのです。
    904 : 887 - 2014/05/26(月) 20:48:41.12 ID:??? (+110,+30,-207)
    >>889-890
    変数がどんなスコープになるかは場所で決まるんじゃなく、宣言によって決まってる
    「ここは~スコープ」という言い方はない。「この宣言だと~スコープ」となる
    結果的にスコープがどうなるかで、このケースは~スコープと言ってるわけではなく
    この宣言はどんなスコープになる種類なのかを話している

    >>891
    確かに同じことの言い回しの問題かもしれない

    >>894
    びっくりして試してみたが初期設定のCh35(現在の安定版)では"OK"が帰った
    そしてES6なら(ブロックスコープ)なら"OK"が帰る

    すまないが返信はまた明日の朝する
    905 : 902 - 2014/05/26(月) 20:53:45.60 ID:??? (+82,-30,-134)
    >>903
    ありがとうございます。おかげ様ですっきりしました
    私はif文内で関数を生成するなら関数式を使うのが自然だと思うので、ES6でもそのようにします

    ところで、ES6 では let 以外は関数スコープとの事でしたが、const もブロックスコープではなかったでしょうか

    あと、細かいことで恐縮ですが、あなたの仰る「関数定義」は「関数宣言」ではないでしょうか
    ES6における関数定義は関数式を含むので文章通りに受け取るとおかしなことになってしまいます
    http://people.mozilla.org/~jorendorff/es6-draft.html#sec-function-definitions
    906 : Name_Not - 2014/05/26(月) 20:56:12.88 ID:??? (+94,+29,-55)
    いや、スコープは場所で決まるんだよ。

    ただし、ブロックスコープで有効な変数は
    letを使うってだけ。

    letを使った所がブロックスコープになるのではない。
    907 : Name_Not - 2014/05/26(月) 20:57:52.72 ID:??? (+69,+29,-74)
    >>905
    > 私はif文内で関数を生成するなら

    いや、そういう区別の仕方はおかしいでしょw

    動的に関数を生成するかどうかで決めるのが正しい。
    動的に関数を定義するのは、定義するタイミングが動的になってしまう。

    これは静的に決まることよりもコードのメンテナンス性という意味で
    悪くなってる。
    908 : Name_Not - 2014/05/26(月) 20:58:36.45 ID:??? (+67,+29,-29)
    >>905
    > あと、細かいことで恐縮ですが、あなたの仰る「関数定義」は「関数宣言」ではないでしょうか
    宣言と定義が明確に区別されているのは、
    C言語ぐらいなので、それはどうでもいいこと。
    909 : Name_Not - 2014/05/26(月) 21:05:16.18 ID:??? (+52,+29,-16)
    おまえらいいかげん他でやれよ
    910 : Name_Not - 2014/05/26(月) 21:09:59.85 ID:??? (+52,+29,-6)
    真面目な会話と横槍の温度差が激しい
    911 : Name_Not - 2014/05/26(月) 21:18:42.82 ID:??? (+55,+27,-32)
    無名関数を直接引数にするとき以外で
    ifの中で関数を生成するってあまりないなぁ。
    912 : Name_Not - 2014/05/26(月) 22:22:56.23 ID:??? (+57,+29,-9)
    仕様の話と主観的な意見が入り混じっていて何だかなあ
    913 : Name_Not - 2014/05/26(月) 22:37:49.43 ID:??? (+57,+29,-20)
    仕様の話なら、仕様見れで終わるわけで、
    掲示板を使う理由がないんだがw
    914 : Name_Not - 2014/05/26(月) 23:03:31.95 ID:??? (+61,+29,-16)
    画像を読み込むときに何%読み込み完了したか表示してるサイトとかたまにみますけど
    あれはどうやってるんですか?
    915 : Name_Not - 2014/05/26(月) 23:45:15.83 ID:??? (+6,-29,-24)
    しかし代替手段のないletを平気で使えるようになるのは3年は待たないと駄目だろうね

    >>914
    XMLHttpRequest progressイベント でggr
    916 : Name_Not - 2014/05/27(火) 01:53:35.43 ID:??? (+62,+29,-57)
    変数のスコープなんて考えを使ってるから、
    セキュリティホールを作り込むんだよ。
    全部グローバルにすればいい。
    昔の堅牢なシステムは全部それで上手くいってた。
    917 : Name_Not - 2014/05/27(火) 02:14:27.39 ID:??? (+6,-29,+0)
    >>916
    それどんなFortranだよ
    919 : Name_Not - 2014/05/27(火) 07:22:47.52 ID:??? (+0,-27,-18)
    lodashで単純なforループをするにはどうしたらいいんですか?
    920 : Name_Not - 2014/05/27(火) 08:10:04.49 ID:??? (+22,-29,-121)
    前の方でfunctionの問題が出ていますが
    コンストラクタ定義をfunctionでして、そのprototype定義をその後ろでしていたとします
    コンストラクタの前でnewしたら、
    既にfunctionは定義されているのでインスタンスは生成できますが、
    プロトタイプは設定されていないのでおかしくなります
    function定義と同じタイミングでプロトタイプも定義する方法はありますか?
    921 : Name_Not - 2014/05/27(火) 08:26:08.98 ID:??? (+57,+29,-32)
    コンストラクタだけが出来て変になるのを防ぐために
    function定義はやめた方がいいってことですよね?
    はい論破
    922 : Name_Not - 2014/05/27(火) 10:24:36.93 ID:??? (+57,+29,-15)
    変になるのを防ぐってwwwww
    せめて日本語を勉強してから論破しろよ
    923 : Name_Not - 2014/05/27(火) 10:37:30.63 ID:??? (+57,+29,-16)
    じゃあお前不完全なオブジェクト出来ていいのかよ
    924 : Name_Not - 2014/05/27(火) 11:17:07.12 ID:??? (+64,+29,-3)
    相当>>780のことを根に持ってるようだね
    925 : Name_Not - 2014/05/27(火) 11:18:44.08 ID:??? (+38,-30,-91)
    >>920
    よくわからんけど、つまりこういうこと?
    変数に関数を代入するやり方では防ぎようがないね。

    var Klass = function () {・・・} // コンストラクタ

    ↑前の方

    ここでインスタンス生成

    ↓後ろ

    Klass.prototype.foo = function () {・・・}
    926 : Name_Not - 2014/05/27(火) 11:27:02.44 ID:??? (+5,-29,-47)
    >>920
    解決策ではないが、
    new が実行される前に その function の prototype を freeze しとけば
    おかしなことになる前にエラーを吐き出してくれる様になるんではないか
    927 : Name_Not - 2014/05/27(火) 11:28:45.59 ID:??? (+6,-30,+0)
    >>920
    > コンストラクタ定義をfunctionでして、そのprototype定義をその後ろでしていたとします
    > コンストラクタの前でnewしたら、
    > 既にfunctionは定義されているのでインスタンスは生成できますが、
    > プロトタイプは設定されていないのでおかしくなります

    図解しようか?

    var klass = new Klass(); // 問題なく動く。(newの中でfooを使っていないならば) なおプロトタイプは後から設定してもよい
    function Klass() {・・・} // コンストラクタ
    Klass.prototype.foo = function () {・・・}

    ↓こっちはもっとひどい。

    var klass1 = new Klass(); // エラーで落ちる。
    var Klass = function () {・・・} // コンストラクタ
    var klass2 = new Klass(); // newの中でfooを使っているとどっちみち落ちる。
    Klass.prototype.foo = function () {・・・}
    928 : Name_Not - 2014/05/27(火) 11:34:24.70 ID:??? (-2,-30,-25)
    根本的な所で考え方が違っているんだよな


    たとえばこういうコード


    var a = foo();

    function foo() { return 1 }


    動くべきか、そうでないか。
    929 : Name_Not - 2014/05/27(火) 11:54:26.99 ID:??? (+91,+29,-17)
    動いちゃうんですねコレ。知らなかった。
    jsファイルがパースされた時点でfooが有効になっていて、
    実行時点で利用可能って解釈で合ってる?
    930 : Name_Not - 2014/05/27(火) 11:58:47.22 ID:??? (+57,+29,-29)
    C言語とかでは動かなくて
    前方参照するために、プロトタイプ宣言とかいう
    機能が必要になってしまう。

    これを不要にした最初の言語は
    Javaだろう。すごいね。
    931 : Name_Not - 2014/05/27(火) 12:07:23.26 ID:??? (+63,+29,-8)
    >>925
    中途半端に動かなくするのが重要なんだよ
    エラーは早い段階で出すようにするのがセオリー
    932 : Name_Not - 2014/05/27(火) 12:08:41.67 ID:??? (+69,+29,-2)
    >>929
    むしろ、なぜ動かないと思ったの?
    933 : Name_Not - 2014/05/27(火) 12:09:46.29 ID:??? (+57,+29,-61)
    異常がある時
    「オブジェクトが生成でき、メソッドを使うまで異常に気付かない」
    より
    「オブジェクトが生成できない」
    の方がいい
    それがA級プログラマーの発想
    934 : Name_Not - 2014/05/27(火) 12:18:12.47 ID:??? (+79,+30,-133)
    >>906
    お前さんの言いたいことは分かったが、>>904の一段落をよく読んでくれ
    結果的な「スコープ」がどうなるかとか、「スコープ」自体の配置の話ではなく、
    宣言によってその変数がどういうスコープに属するのかということで、
    この宣言では~スコープという言い方をしている
    この「場所」がスコープになると言っているわけではない
    935 : Name_Not - 2014/05/27(火) 13:03:33.34 ID:??? (+62,+29,-128)
    JSはメソッドをすげ替えて呼ぶこともできるんだから、どちらにせよメソッド側のチェックも必要。
    コンストラクタでは、thisが確実にクラスのインスタンスであり、未初期化なオブジェクトであることを確認して初期化する。
    メソッドではthisが確実にクラスのインスタンスであり、初期化済みのオブジェクトであることを確認して扱う。
    これが鉄則で、ビルドインAPIでも使われている手法。
    936 : Name_Not - 2014/05/27(火) 13:37:54.80 ID:??? (+57,+29,-3)
    そんな面倒くさいチェック普通しないだろ
    937 : Name_Not - 2014/05/27(火) 13:59:12.48 ID:??? (+38,+10,-30)
    というか適切なprototypeを持っているかどうかってどうやってチェックできるの?
    938 : Name_Not - 2014/05/27(火) 14:59:14.30 ID:??? (+3,-30,+0)
    こんな感じになるはず

    // lib/private.js
    export default const $ = (map => base => {
     let priv = map.get(base)
     if (!priv) map.set(base, priv = {__proto__: null})
     return priv
    })(new WeakMap)
    ~~~~~~

    // main.js
    import {ASSERT, UTIL} from 'lib/helpers'
    import  from 'lib/private'
    const {$$crate} = Symbol

    const Person = UTIL.CLASS_FREEZE(class {
     [$$create]() {
      let U = undefined・
      return Object.assign((super()), {PersonName:U})
     }
     constructor(name) {
      ASSERT.UNINITIALIZED((this), ['PersonName']) // has && undefined
      ASSERT.TYPEOF(name, 'srting', {minLength:1, maxLength:100})
      (this).PersonName = name
     }
     getName() {
      ASSERT.INITIALIZED((this), ['PersonName']) // has && !undefined
      return (this).PersonName
     }
    })
    939 : Name_Not - 2014/05/27(火) 16:24:54.09 ID:??? (+32,+9,-1)
    機種依存文字やめろや
    942 : 東日本大震災 - 2014/05/27(火) 19:03:25.53 ID:??? (+63,+30,-179)
    これねー誰もおらん所で言うのでれむじー。

    横綱渡り
    剛君が横に出たー?とか

    横綱に志賀剛君が出てきた所とか。
    お頂いで横綱に食べに行ってるはず。

    知らんなら知らんて言ってー。
    お前うっとうしーよーいい加減ていうか俺今水男だよーとか

    四日市と春日井市の間で車を追い抜いた所。
    今の気持ちを大切にね。

    かっこいいのになー。
    なんでだろうなー。

    ネクタイの縛り方

    連舞と乱舞
    しっしっしっしっしっしっしっし。

    俺たち記憶の倉庫ばーん。
    僕も中島って言うだよ。

    あ、僕の1UPきのこが。
    なんでねー俺がお前の疲れ取り?
    えー自分で自分の首を絞めてる事に早く気づきましょう。

    で、僕が一応ファイナルスターの
    945 : 943 - 2014/05/27(火) 23:21:43.21 ID:zsvIvzaH (-11,+29,-60)
    自分ちで2ちゃんできないので今日いったんこれで上がります。
    IE10の他の環境でも再現すれば、他の方法を考えたいと思っているので
    試してもらえるとありがたいです。
    現時点ではプリンタの問題とゆう可能性も捨てきれず、曖昧な状態なので・・・

    一応こちらではこの後 window.open()でのコードを作って
    試してみようと思ってますm(_ _)m
    947 : Name_Not - 2014/05/28(水) 02:27:46.91 ID:??? (-3,-29,-30)
    >>945
    floatがclearfixされてないとか、css由来の問題だろうね。
    印刷プレビューの時点でおかしいの?
    948 : Name_Not - 2014/05/28(水) 03:57:45.93 ID:??? (+3,-30,-66)
    iframe側のc.htmlが、本体であるb.htmlのCSSに影響を受けるの?

    b.html, c.htmlのCSSを、各b.css, c.cssとすると、
    c.htmlのデザインは、c.cssに書けばよいと思う
    949 : Name_Not - 2014/05/28(水) 06:54:11.10 ID:??? (+67,-29,-42)
    あるイベントで絶対に実行させたい処理があるときはどうしたらいいですか?
    イベント伝播の最上位のdocumentで処理すれば一応できそうですが
    その前にstopPropagationされたら止まりますよね?
    950 : Name_Not - 2014/05/28(水) 08:16:21.33 ID:??? (+53,+26,+0)
    >>949
    絶対は不可能です
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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