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

私的良スレ書庫

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

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

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
453 : Name_Not - 2017/10/11(水) 00:12:29.66 ID:???.net (+25,-24,-27)
JavaScript の、this は、コロコロ変わるから難しい。
bind を使わないと、拘束できない

jQuery を使えば、悩むこともない
454 : Name_Not - 2017/10/11(水) 01:05:45.44 ID:???.net (+33,-30,+0)
>>453
jQueryを使ってもそこは一緒
だけどjQueryだとクロージャーを使っても循環参照になりづらいのと
DOM要素のリストとして扱うという設計思想によって扱いやすいってだけ

でさ、お前ら何やってんの?
>>437の話だろ? なんでthisを保存とかいう話になってんの?

addEventListenerの第二引数にクロージャーなんか渡すから
話ややこしくなってるじゃん。 >>437のコードでだいたいあってるだろ

http://jsfiddle.net/rdeuvep2/

function Hoge(elementId) {
 this.div = document.getElementById(elementId)
}

Hoge.prototype.foo = function() {
 var button = document.createElement( "input" );
 button.type = "button";
 button.value = "テスト";
 button.addEventListener( "click", this.bar, false );
 this.div.appendChild( button );
}

Hoge.prototype.bar = function() {
 alert( "click" );
};

var hoge = new Hoge("buttons");
hoge.foo();
455 : Name_Not - 2017/10/11(水) 01:05:49.61 ID:???.net (+61,-2,-11)
ここまで
アロー関数
無し
456 : Name_Not - 2017/10/11(水) 01:26:52.82 ID:???.net (+6,-30,+0)
んで、恒例のjQuery化w

なるべく元の形を保ったバージョン
http://jsfiddle.net/rdeuvep2/1/

function Hoge(elementId) {
 this.elementId = elementId
}
Hoge.prototype.foo = function(){
 $("<input>", {type: "button", value: "テスト"}).click(this.bar).appendTo(this.elementId)
}
Hoge.prototype.bar = function(){
 alert( "click" );
};
var hoge = new Hoge("#buttons");
hoge.foo()


俺はHogeクラスなんか作らずこんなんでいいと思ってる
http://jsfiddle.net/rdeuvep2/2/

var attrs = [{value: "テスト1"}, {value: "テスト2"}];
var buttons = attrs.map(attr => $("<input>", attr).attr({type: 'button'}));
$("#buttons").append(buttons).on('click', 'input[type="button"]', function() {
  alert( "click " + this.value);
});


>>455
アロー関数使ってやったぜ?w
457 : Name_Not - 2017/10/11(水) 01:33:53.93 ID:???.net (+67,+26,-48)
classを使って書いたバージョン
http://jsfiddle.net/rdeuvep2/3/

>>455
アロー関数つかってやったが、
>>454で書いたとおり、今回はアロー関数もクロージャーもいらない
458 : Name_Not - 2017/10/11(水) 01:55:18.33 ID:???.net (+62,+29,-51)
補足

「今回は」アロー関数もクロージャーもいらない
今回の要件にthisがどうなるかってのが書かれていないから

this.barは今回は動くがthisは違っていると念の為に言っておく
いろんなサンプル追加
http://jsfiddle.net/rdeuvep2/6/
459 : Name_Not - 2017/10/11(水) 11:15:54.27 ID:???.net (+76,+29,-54)
qiitaで記事うpしても叩かれない知識を身に着けたいんですが
JavaScriptという言語を学ぶための良書を教えてください
460 : Name_Not - 2017/10/11(水) 11:30:31.56 ID:???.net (+63,+30,-64)
その考え方は大間違い
人に意見を発信する以上は文句を付けられて当たり前
そしてそれは良いこと
お互い内外から叩き合ってきれいな球に近づくのだから
それを防ごうと言うのはトゲトゲボールか、スライムになってしまうのがオチ
461 : Name_Not - 2017/10/11(水) 13:29:50.02 ID:pDOfqRkM.net (+24,+28,-1)
>>453
えええ…
462 : Name_Not - 2017/10/11(水) 13:33:31.58 ID:pDOfqRkM.net (+38,+30,-35)
>>459
とりあえずサイ本

現段階のおまえさんのレベルも
おまえさんが書いた記事にツッコミを入れる奴のレベルもわからんから
それを数冊の本でなんとかするのは難しかろう
463 : Name_Not - 2017/10/11(水) 21:27:55.35 ID:???.net (-1,-29,-8)
JavaScript 第6版、2012、David Flanagan

Google などのプロの机に、必ず置いてある本
464 : Name_Not - 2017/10/12(木) 02:50:11.63 ID:???.net (+62,+29,-114)
プロのJSerやWEBエンジニアならオンライン仕様書以外は必要ない
そういうのはJSの常識を知らない非JSネイティブプログラマ向けに用意されてる
それもES2015以降の今の時代に於いては、JSを歴史から学んでJS仙人を目指したい人以外には過去の有名な本という飾りでしかない
465 : Name_Not - 2017/10/12(木) 10:20:16.44 ID:???.net (+64,+23,-2)
仕様書ってどこ見たらいいのか教えてください
466 : Name_Not - 2017/10/12(木) 12:22:02.77 ID:???.net (+21,-13,-27)
>>465
何の仕様書を読みたいのか分からないが、>>4-5
http://fiddle.jshell.net/vSqKr/44/show/light/#Link
467 : Name_Not - 2017/10/12(木) 14:33:35.31 ID:???.net (+57,+29,-39)
初心者はまずはMDN 「MDN ○○」でググる
そしてより詳しく知りたければMDNの各記事の下に仕様へのリンクが張ってある
徐々にそっちに移行していく
468 : Name_Not - 2017/10/13(金) 05:38:27.50 ID:???.net (+19,-30,-261)
let lastTimeSignal;
setInterval(fuction(){
let now = moment();
let nowMinutes = now.format('YYYYMMDDHHmm');
if (now.minutes()==0 && lastTimeSignal !== nowMinutes){
lastTimeSignal = nowMinutes;
/*処理*/

},1000);

みたいなコードがあります
moment()はmoment.jsです
現在時刻の分数が0の時に一度だけ実行する、ようは時報です
ですが、ごくまれに連続して複数回時報が実行されてしまうことがあります
lastTimeSignalが設定されるので排他的に処理されるはずなのに
何故複数回実行されてしまうのか分かりません
現象はchromeで確認しています
lastTimeSignal とnowMinutesをログに出力するようにしましたが
連続実行された時の値は全く同一でした
lastTimeSignalが設定されないまま
複数のインターバルが呼び出されている、としか思えません
処理は、何かと不安定なSpeechSynthesisUtteranceを使っているので
それが原因なのかとも思いますが
処理の前にlastTimeSignal = nowMinutesとすぐに代入しているので、
たとえSpeechSynthesisUtteranceに問題があっても排他処理まで失敗するのは奇妙です
関数の外の変数(lastTimeSignal)への変更が
すぐに反映しない、なんてことあり得ますか?
469 : Name_Not - 2017/10/13(金) 05:49:09.33 ID:???.net (+4,-30,-83)
>>468
あらためてログを確認すると
10/13 05:00:00.97
10/13 05:00:00.98
と、0.01秒差で連続実行されていました
1秒ごとに実行されるはずのインターバル処理が、
ほぼ同時に2回呼び出されていることになります
一体何故・・?
いま、ふと思い付いたのですが
不安定なSpeechSynthesisUtteranceの実行に更にsetTimeoutを挟めば
変数の変更まで不安定になることは防げるかもしれません
470 : Name_Not - 2017/10/13(金) 08:14:29.32 ID:???.net (+57,+29,-50)
とにかく問題が再現できる最小限のコードを貼りなさい
できればライブラリも除いた状態で
まずそうやって削ぎ落としていくのがデバッグの基本でもある
471 : Name_Not - 2017/10/13(金) 08:45:04.05 ID:???.net (-1,-29,-5)
ここに質問するくらいならteratail使えや。コード見づらい。
472 : Name_Not - 2017/10/13(金) 08:55:34.75 ID:???.net (+57,+29,-26)
明確な根拠もなく実行系を疑うのはプログラマ憲法でタブーとされていること
473 : Name_Not - 2017/10/13(金) 10:07:02.56 ID:???.net (+57,+29,-5)
プログラマーが権力機構で処理系が労働者なのか
474 : 468 - 2017/10/13(金) 11:59:42.51 ID:???.net (+62,+29,-56)
恥ずかしいことに、インターバルタイマーを複数回設定していたのが原因でした
ライブラリの中の、
起動時にしか実行されないと思っていたハンドラの中で設定していたのですが
そのハンドラはその後の操作によっては複数回呼び出されるものだったのです
プログラマー憲法を心に銘じます
ありがとうございました
475 : Name_Not - 2017/10/13(金) 12:55:11.16 ID:???.net (+52,+29,-14)
思った通りの原因だった
476 : Name_Not - 2017/10/13(金) 14:57:43.69 ID:???.net (+3,-29,-67)
まあでも非同期が絡むとデバッグが一段と難しくなるのは事実
ただコールバックで闇雲に投げて闇雲に呼ばれるのではなく
Promise,async-await,async generator辺りを適切に使って
シーケンシャルに管理すれば軽減できはする
477 : Name_Not - 2017/10/13(金) 21:36:52.40 ID:???.net (+57,+29,-78)
jsだと無名関数にしてしまう分、普通に何回も呼び出してしまうよな
アクセス解析の値がぶっとんでた時はあせったわ
478 : Name_Not - 2017/10/13(金) 22:36:21.13 ID:???.net (+57,+29,-18)
無名関数だからって理由でそんなことすることはないな。
だって名前つけても同じ話だもの
479 : Name_Not - 2017/10/13(金) 22:53:31.34 ID:???.net (+57,+29,-23)
無名関数ならそこでしか使わないんだから
逆に予定外に何度も呼び出すことなんて少ないと思うが
480 : Name_Not - 2017/10/15(日) 05:37:52.44 ID:???.net (+18,-29,-77)
ES2015でforEachがオブジェクトに追加されなかったのは何故ですか?
最近のJSはイケてると思っていましたが
いまだにオブジェクトをforEachできないのは違和感があります
もうかなり以前からunderscoreやlodashがforEachの有用性を証明してますよね
481 : Name_Not - 2017/10/15(日) 08:34:02.97 ID:???.net (+47,+19,+0)
そういうことするならmapって話なんじゃね
482 : Name_Not - 2017/10/15(日) 09:32:29.63 ID:???.net (+23,-6,-16)
>>480
だからlodashを使えばいいだけだろう?
483 : Name_Not - 2017/10/15(日) 10:54:03.53 ID:???.net (+91,+29,-59)
mapは新しい配列を作るためのものなので用途が違います
ライブラリは言語にあるべき未来を見せるのが役割の一つなので
それを何年も前に見せられてなおかつ放置してるのは怠慢と言わざるを得ません
484 : Name_Not - 2017/10/15(日) 10:58:56.24 ID:???.net (+57,+29,-32)
いや、ライブラリは言語仕様をシンプルにするのが目的だよ。
どんな言語でも言語自体に色んな機能を含めず
多くの機能はライブラリで提供されてるはずだ。
485 : Name_Not - 2017/10/15(日) 11:01:57.27 ID:???.net (+70,+29,-15)
>>483
Mapと書くべきだったか
まあ意図は違うんだろうけど
486 : Name_Not - 2017/10/15(日) 11:46:59.23 ID:???.net (+1,-26,-19)
Mapじゃなくて地図と書くべき。
でないと、SMAPと勘違いされる可能性がある。
487 : Name_Not - 2017/10/15(日) 12:07:56.25 ID:???.net (+57,+29,-37)
あの文脈ならMapで通じると思うけど
つーかもうオブジェクトからイテレーター作れるじゃん
488 : Name_Not - 2017/10/15(日) 12:32:13.73 ID:???.net (+40,-30,-121)
mapメソッドとは別にMapオブジェクトというのがあったのですね
イテラブルではない普通のオブジェクトを回すのはあまり行儀が良くない、
という判断が根底にあるのでしょうか?
でも

(new Map([['taro','name'],[15,'age']])).forEach((key,value)=>{
});

こんな書き方がイケてるとはあまり思えないのですが・・
newを書かずにMapオブジェクトを生成する
シンタックスシュガーを用意して欲しいところです
489 : Name_Not - 2017/10/15(日) 13:54:43.41 ID:???.net (+62,+29,-3)
>>488
シンタックスシュガーはいらないですね。
関数を用意すればいいだけですよ。
490 : Name_Not - 2017/10/15(日) 16:55:28.69 ID:???.net (+14,-30,-11)
>>488
Object.entries(obj).forEach(([key,value])=>{})
491 : Name_Not - 2017/10/16(月) 02:27:09.92 ID:???.net (+50,-16,-37)
>>490
これはなかなかいいですね
オブジェクトのインスタンスメソッドで出来て欲しいですが、
keyとvalueだけでなくindexも取れるところもイケてると思います
492 : Name_Not - 2017/10/16(月) 04:26:51.39 ID:???.net (+69,+29,-65)
>>491
そのやり方は列挙順を保証出来ないから、順序がランダムで良いときしか使えない
もともと、オブジェクトのキーは列挙する事を想定したものでもないし、連祖配列的なものを望むなら、足りない機能が多くて苦労すると思うよ
493 : Name_Not - 2017/10/16(月) 05:35:03.12 ID:???.net (-1,-29,-9)
順序はランダムではありません
http://tc39.github.io/ecma262/#sec-ordinaryownpropertykeys
494 : Name_Not - 2017/10/16(月) 11:42:32.24 ID:???.net (+57,+29,-32)
たしかにオブジェクトのメンバに順序は期待出来ないですが
ループの中でループカウンタが欲しくなることはわりとあるので、
そういう意味です
495 : Name_Not - 2017/10/16(月) 16:38:35.98 ID:???.net (+7,-30,-57)
未だにES5脳な奴がいるんだな
列挙の順序が保証されてないのはfor-in文とES5のObject.keys()
ES2015以降のObject.{keys,values.entries}()は保証されている
こんなんJSerなら誰でも知ってる常識だろう
496 : Name_Not - 2017/10/16(月) 23:03:35.08 ID:???.net (+0,-29,-23)
>>495
矛盾してるぞ

> こんなんJSerなら誰でも知ってる常識だろう

ES5脳なJSerは知らないだろ?
497 : Name_Not - 2017/10/17(火) 00:58:39.12 ID:???.net (+2,-25,-5)
JSは日進月歩なんだから
未だにES5脳な奴がJSerなわけ無いだろ
498 : Name_Not - 2017/10/17(火) 01:08:17.62 ID:???.net (-2,-30,-41)
JSerの定義でもめるぐらいなら、ES5erとES2015erに分けろ
JavaScript===ECMAScript2015ではないんだぞ
499 : Name_Not - 2017/10/17(火) 08:24:06.23 ID:???.net (+76,-23,-86)
async-awaitで逐次処理書いてる時に比較的長いタスクをやらせると
裏で動いているのかどうか分かんなくなるんですが。
定期的にconsole.logとかでログ出力していれば分かるんですが、
そうでない場合、逐次処理が実行中だってどうやって把握すればいいんですかね?
500 : Name_Not - 2017/10/17(火) 10:53:45.44 ID:???.net (+39,-30,-140)
そりゃconsole.logを適切な個数置くしか無いよ

それかメイン関数以外にあちこち置くのが嫌なら
await longTimeTask()
をpromiseが解決するまで一秒ごとにログを出すperiodicLogingを用意して
await periodicLoging( 'タスクA', longTimeTask() )
と書くとか、同様にしてタイムアウトさせたりするとか
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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