元スレ+ JavaScript の質問用スレッド vol.115 +
JavaScript覧 / PC版 /みんなの評価 :
901 = :
>>899
めんどくせぇやつだな。
関数直下以外はブロックスコープだよ。
関数スコープはなくなったわけじゃないし、
letを使わない限り、関数スコープ。
ES5では関数スコープしかなくて、
ES6で新たにブロックスコープという概念が追加されたの。
902 = :
>>898
> letを使わない限り変数は関数スコープとなり、ブロックスコープはオプションと考えられる。
お手すきであれば教えて頂きたいのですが、>>887の「if文内での関数宣言がブロックスコープ」はES6にはない仕様で合ってるでしょうか
http://people.mozilla.org/~jorendorff/es6-draft.html から該当仕様を探そうとしていますが、見つけることが出来ず
自分の読解力がないだけなのか、本当に存在しないのか判断出来ませんでした
903 = :
>>902
はいそうです。
関数定義はブロックでやってはいけません。
そもそも、動的に定義する必要がないものは静的に定義するのが良いコードなので、
関数定義は(必要がない限り)function文で行うものです。function式で行うべきじゃありません。
ifなどのブロックは実行時に処理されるかどうか決まるので本質的に動的です。
だから静的に行うべき関数定義は、静的に、ゆえに関数スコープでやるべきなのです。
904 = :
>>889-890
変数がどんなスコープになるかは場所で決まるんじゃなく、宣言によって決まってる
「ここは~スコープ」という言い方はない。「この宣言だと~スコープ」となる
結果的にスコープがどうなるかで、このケースは~スコープと言ってるわけではなく
この宣言はどんなスコープになる種類なのかを話している
>>891
確かに同じことの言い回しの問題かもしれない
>>894
びっくりして試してみたが初期設定のCh35(現在の安定版)では"OK"が帰った
そしてES6なら(ブロックスコープ)なら"OK"が帰る
すまないが返信はまた明日の朝する
905 = :
>>903
ありがとうございます。おかげ様ですっきりしました
私はif文内で関数を生成するなら関数式を使うのが自然だと思うので、ES6でもそのようにします
ところで、ES6 では let 以外は関数スコープとの事でしたが、const もブロックスコープではなかったでしょうか
あと、細かいことで恐縮ですが、あなたの仰る「関数定義」は「関数宣言」ではないでしょうか
ES6における関数定義は関数式を含むので文章通りに受け取るとおかしなことになってしまいます
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-function-definitions
906 = :
いや、スコープは場所で決まるんだよ。
ただし、ブロックスコープで有効な変数は
letを使うってだけ。
letを使った所がブロックスコープになるのではない。
907 = :
>>905
> 私はif文内で関数を生成するなら
いや、そういう区別の仕方はおかしいでしょw
動的に関数を生成するかどうかで決めるのが正しい。
動的に関数を定義するのは、定義するタイミングが動的になってしまう。
これは静的に決まることよりもコードのメンテナンス性という意味で
悪くなってる。
908 = :
>>905
> あと、細かいことで恐縮ですが、あなたの仰る「関数定義」は「関数宣言」ではないでしょうか
宣言と定義が明確に区別されているのは、
C言語ぐらいなので、それはどうでもいいこと。
909 = :
おまえらいいかげん他でやれよ
910 = :
真面目な会話と横槍の温度差が激しい
911 = :
無名関数を直接引数にするとき以外で
ifの中で関数を生成するってあまりないなぁ。
912 = :
仕様の話と主観的な意見が入り混じっていて何だかなあ
913 = :
仕様の話なら、仕様見れで終わるわけで、
掲示板を使う理由がないんだがw
914 = :
画像を読み込むときに何%読み込み完了したか表示してるサイトとかたまにみますけど
あれはどうやってるんですか?
915 = :
しかし代替手段のないletを平気で使えるようになるのは3年は待たないと駄目だろうね
>>914
XMLHttpRequest progressイベント でggr
916 = :
変数のスコープなんて考えを使ってるから、
セキュリティホールを作り込むんだよ。
全部グローバルにすればいい。
昔の堅牢なシステムは全部それで上手くいってた。
917 = :
>>916
それどんなFortranだよ
919 = :
lodashで単純なforループをするにはどうしたらいいんですか?
920 = :
前の方でfunctionの問題が出ていますが
コンストラクタ定義をfunctionでして、そのprototype定義をその後ろでしていたとします
コンストラクタの前でnewしたら、
既にfunctionは定義されているのでインスタンスは生成できますが、
プロトタイプは設定されていないのでおかしくなります
function定義と同じタイミングでプロトタイプも定義する方法はありますか?
921 = :
コンストラクタだけが出来て変になるのを防ぐために
function定義はやめた方がいいってことですよね?
はい論破
922 = :
変になるのを防ぐってwwwww
せめて日本語を勉強してから論破しろよ
923 = :
じゃあお前不完全なオブジェクト出来ていいのかよ
924 = :
相当>>780のことを根に持ってるようだね
925 = :
>>920
よくわからんけど、つまりこういうこと?
変数に関数を代入するやり方では防ぎようがないね。
var Klass = function () {・・・} // コンストラクタ
↑前の方
ここでインスタンス生成
↓後ろ
Klass.prototype.foo = function () {・・・}
926 = :
>>920
解決策ではないが、
new が実行される前に その function の prototype を freeze しとけば
おかしなことになる前にエラーを吐き出してくれる様になるんではないか
927 = :
>>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 () {・・・}
929 = :
動いちゃうんですねコレ。知らなかった。
jsファイルがパースされた時点でfooが有効になっていて、
実行時点で利用可能って解釈で合ってる?
930 = :
C言語とかでは動かなくて
前方参照するために、プロトタイプ宣言とかいう
機能が必要になってしまう。
これを不要にした最初の言語は
Javaだろう。すごいね。
931 = :
>>925
中途半端に動かなくするのが重要なんだよ
エラーは早い段階で出すようにするのがセオリー
932 = :
>>929
むしろ、なぜ動かないと思ったの?
933 = :
異常がある時
「オブジェクトが生成でき、メソッドを使うまで異常に気付かない」
より
「オブジェクトが生成できない」
の方がいい
それがA級プログラマーの発想
934 = :
>>906
お前さんの言いたいことは分かったが、>>904の一段落をよく読んでくれ
結果的な「スコープ」がどうなるかとか、「スコープ」自体の配置の話ではなく、
宣言によってその変数がどういうスコープに属するのかということで、
この宣言では~スコープという言い方をしている
この「場所」がスコープになると言っているわけではない
935 = :
JSはメソッドをすげ替えて呼ぶこともできるんだから、どちらにせよメソッド側のチェックも必要。
コンストラクタでは、thisが確実にクラスのインスタンスであり、未初期化なオブジェクトであることを確認して初期化する。
メソッドではthisが確実にクラスのインスタンスであり、初期化済みのオブジェクトであることを確認して扱う。
これが鉄則で、ビルドインAPIでも使われている手法。
936 = :
そんな面倒くさいチェック普通しないだろ
937 = :
というか適切なprototypeを持っているかどうかってどうやってチェックできるの?
938 = :
こんな感じになるはず
// 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 = :
機種依存文字やめろや
942 = :
これねー誰もおらん所で言うのでれむじー。
横綱渡り
剛君が横に出たー?とか
横綱に志賀剛君が出てきた所とか。
お頂いで横綱に食べに行ってるはず。
知らんなら知らんて言ってー。
お前うっとうしーよーいい加減ていうか俺今水男だよーとか
四日市と春日井市の間で車を追い抜いた所。
今の気持ちを大切にね。
かっこいいのになー。
なんでだろうなー。
ネクタイの縛り方
連舞と乱舞
しっしっしっしっしっしっしっし。
俺たち記憶の倉庫ばーん。
僕も中島って言うだよ。
あ、僕の1UPきのこが。
なんでねー俺がお前の疲れ取り?
えー自分で自分の首を絞めてる事に早く気づきましょう。
で、僕が一応ファイナルスターの
948 = :
iframe側のc.htmlが、本体であるb.htmlのCSSに影響を受けるの?
b.html, c.htmlのCSSを、各b.css, c.cssとすると、
c.htmlのデザインは、c.cssに書けばよいと思う
949 = :
あるイベントで絶対に実行させたい処理があるときはどうしたらいいですか?
イベント伝播の最上位のdocumentで処理すれば一応できそうですが
その前にstopPropagationされたら止まりますよね?
950 = :
>>949
絶対は不可能です
類似してるかもしれないスレッド
- + JavaScript の質問用スレッド vol.113 + (1001) - [97%] - 2014/1/25 12:46
- + JavaScript の質問用スレッド vol.135 + (1002) - [97%] - 2018/11/23 10:30
- + JavaScript の質問用スレッド vol.125 + (1001) - [97%] - 2015/10/7 17:45
- + JavaScript の質問用スレッド vol.119 + (1002) - [97%] - 2014/10/3 15:30
- + JavaScript の質問用スレッド vol.118 + (1002) - [97%] - 2014/8/29 22:30
- + JavaScript の質問用スレッド vol.117 + (1009) - [97%] - 2014/8/5 3:30
- + JavaScript の質問用スレッド vol.116 + (1002) - [97%] - 2014/7/1 0:45
- + JavaScript の質問用スレッド vol.114 + (1001) - [97%] - 2014/5/3 10:45
- + JavaScript の質問用スレッド vol.112 + (1001) - [97%] - 2013/11/27 16:46
- + JavaScript の質問用スレッド vol.111 + (1001) - [97%] - 2013/11/4 6:00
- + JavaScript の質問用スレッド vol.110 + (1001) - [97%] - 2013/10/13 14:01
- + JavaScript の質問用スレッド vol.113 + (1001) - [97%] - 2014/3/15 21:30
- + JavaScript の質問用スレッド vol.105 + (1001) - [97%] - 2013/5/20 4:45
- + JavaScript の質問用スレッド vol.109 + (1001) - [95%] - 2013/10/7 13:16
- + JavaScript の質問用スレッド vol.121 + (1001) - [95%] - 2022/11/29 16:30
- + JavaScript の質問用スレッド vol.126 + (348) - [95%] - 2023/1/12 17:00
- + JavaScript の質問用スレッド vol.100 + (1001) - [95%] - 2012/6/13 22:46
トップメニューへ / →のくす牧場書庫について