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

私的良スレ書庫

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

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

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
552 : Name_Not - 2019/03/31(日) 20:53:45.79 ID:???.net (+7,-30,-213)
$('.hoge').each(function(i, elem) {
console.log(elem);
});
を、
$('.hoge').each(function() {
console.log(this);
});
と書けるのは、jQueryがelemをthisにバインドしてるからでしょ。
アロー関数使ってこれは無理。
$('.hoge').each(() => {
console.log(this);
});

つまりjQueryバカ君は「this変えられるfunction最高!アローはクソ!」って言いたいんだねw
553 : Name_Not - 2019/03/31(日) 21:03:38.59 ID:???.net (+3,-30,-121)
>>552
アロー関数を使う場合はこうな。

$('.hoge').each((i, elem) => console.log(elem));

ってか、アロー関数はthisをバインドしないんだから
引数でやるしか無いでしょ?jQueryの問題じゃないよ。
アロー関数使う以上、thisは関数の外のものが使われる
554 : Name_Not - 2019/03/31(日) 21:05:11.90 ID:???.net (+0,-27,-34)
jQueryはもちろんアロー関数と組み合わせて便利に使えます(当たり前)
555 : Name_Not - 2019/03/31(日) 21:19:31.52 ID:???.net (+31,-30,+0)
jQueryバカ君の主張まとめ:

アロー関数で書く
$('.hoge').each((i, elem) => {
console.log(elem);
});
は、functionでも同じく
$('.hoge').each(function(i, elem) {
console.log(elem);
});
と書ける。
しかしjQueryはわざわざelemをthisにバインドして
$('.hoge').each(function() {
console.log(this);
});
と書けるようにしている。
これは全く無駄なことである。
つまりjQueryは必要もないのにthis変えるアホである。
そうではなく
$('.hoge').each(function() {
console.log(this);
});
と書けることに価値があるのであれば、
$('.hoge').each(() => {
console.log(this);
});
と書けないアロー関数はクソということになってしまうからだ。

…と、こういうことか…
556 : Name_Not - 2019/03/31(日) 21:21:12.05 ID:???.net (+55,+27,-1)
>>555
ぜんぜん違うよw
557 : Name_Not - 2019/03/31(日) 21:25:19.40 ID:???.net (+64,+29,-35)
>>551
変わってないよ
ただのfunctionなんだからグローバルになるのは仕様通りだし自然じゃん

何から何に変わったと主張しているの?
559 : Name_Not - 2019/03/31(日) 21:33:17.64 ID:???.net (+7,-30,-88)
これも例の一つ。thisがクラス自身を指していない。

class Foo {
 constructor(){
  this.value = 100;
 }
 foo() {
  console.log(this.value); // 100と表示される
  var ar = [1, 2, 3];
  ar.forEach(function() {
   console.log(this.value); // エラーになる
  })
 }
}

var f = new Foo();
f.foo();
560 : Name_Not - 2019/03/31(日) 21:36:03.76 ID:???.net (-1,-29,-26)
しかも>>559の場合、forEachの中のthisはundefined。
Global(Window)じゃない。
使い方によってthisがコロコロ変わる
562 : Name_Not - 2019/03/31(日) 21:42:45.57 ID:???.net (-25,-30,-97)
>>561
> ただaddEventListenerは引数の関数をDOM要素にバインドする関数だから
> バインド先のDOM要素がthisになるってだけ

じゃあ。

my.foo(function() {
 // ここのthisはなんになる?
}

関数ごとにバラバラじゃないですか?

関数ごとにバラバラであっていいっていうのが、
JavaScriptの正しい仕様なんですか?
565 : Name_Not - 2019/03/31(日) 22:21:54.26 ID:???.net (+3,-30,-110)
>>563補足
strictモードだと
thisで返るのはグローバルではなくundefinedになる

いずれにせよ、メソッドとして実行されていないので
参照されても返すものがねえって意味で

>>564補足
function foo(){}

は関数文

var foo = function(){};
bar.forEach(function(){});

は関数リテラル
なんで正確にはちょっと違うんだけど、まあ捨て置け
566 : Name_Not - 2019/03/31(日) 22:24:15.51 ID:???.net (+53,+2,-33)
>>562
コールバック関数がthis束縛するはずない
一度、コードを書いてみろ
567 : Name_Not - 2019/03/31(日) 22:37:34.12 ID:rWRvnw+C.net (+27,+29,-36)
>>561
>んで、何のメンバでもない関数はどのスコープで作られようと
>グローバルのメンバ扱いになる

これはちょっと乱暴w
568 : Name_Not - 2019/03/31(日) 22:37:49.34 ID:rWRvnw+C.net (+11,+13,+0)
だった
570 : Name_Not - 2019/04/01(月) 00:23:56.82 ID:???.net (+3,-29,-110)
ようするに、DOM要素にaddEventListenerで登録した
イベントハンドラの中でthisがDOM要素になっているのは、

DOM要素が複数のイベントハンドラを呼び出す時に
わざわざthisをDOM要素に変更して呼び出しているはずだ
571 : Name_Not - 2019/04/01(月) 00:29:02.24 ID:???.net (+122,+9,-67)
>>566
そりゃそうよ。コールバック関数自体はどのオブジェクトにも
紐付いてないのだからthis束縛はされていない

addEventListerとかは、わざわざ自分の要素が
thisになるようにしてからコールバック関数を呼び出している。
572 : Name_Not - 2019/04/01(月) 00:55:47.10 ID:???.net (-1,-29,-10)
関数をネストすると、内側のthis が、window になってしまう

漏れは、そういう認識です
574 : Name_Not - 2019/04/01(月) 01:44:17.16 ID:???.net (+21,-29,-30)
>>573
知ってるよ?addEventListenerは
callとかapplyを使って、関数を呼び出す時に
thisを変更してから呼び出してるよねって話をしてる
575 : Name_Not - 2019/04/01(月) 06:07:30.29 ID:???.net (-1,-29,-36)
グローバルのメンバ云々は全く関係なくて
thisArgがundefinedのときsloppy modeではglobalThisに置き換えられてただけ
576 : Name_Not - 2019/04/01(月) 06:41:07.52 ID:???.net (+102,+29,-19)
>>571
jQuery君がそれを理解してくれれば解決なんだがね
577 : 568 - 2019/04/01(月) 08:10:47.92 ID:???.net (+103,+28,-17)
>>576
俺がそのjQuery君なわけだがw
578 : Name_Not - 2019/04/01(月) 11:02:31.57 ID:???.net (+94,+29,-28)
>>574
アホか
バインドするメソッドなんだからそうするに決まっとろうが
579 : Name_Not - 2019/04/01(月) 12:30:27.39 ID:???.net (+112,+29,-1)
>>577
>>535もお前なら、>>571と矛盾してる
580 : Name_Not - 2019/04/01(月) 13:01:46.00 ID:???.net (+70,+29,-71)
>>578
> バインドするメソッドなんだからそうするに決まっとろうが

バインドするメソッドとは?
それはどういう意味で、
どこにそういう仕様であると書いてあるんですか?
581 : Name_Not - 2019/04/01(月) 14:38:53.39 ID:???.net (+57,+29,-23)
変なの湧いてるなあ
なんか名前書いてよ
興味のある人は読むし
ない人はNGすっから
582 : Name_Not - 2019/04/01(月) 14:52:34.84 ID:???.net (+57,+29,-4)
まずは言い出しっぺが名前を書くように
583 : Name_Not - 2019/04/01(月) 15:18:31.39 ID:???.net (+49,+26,-2)
自覚あってワロタ
584 : Name_Not - 2019/04/01(月) 15:19:53.04 ID:???.net (+4,-18,+1)
じゃなくて名前。はよ
585 : Name_Not - 2019/04/01(月) 15:38:30.56 ID:???.net (+57,+29,-65)
"バインドするメソッド" で検索しても何も見つからんわ
むしろ一番最初にjQueryでてきた
オレオレ用語使ってないで、ちゃんと説明しろ
587 : Name_Not - 2019/04/01(月) 19:36:34.49 ID:???.net (-7,-30,-30)
589 : Name_Not - 2019/04/01(月) 20:41:20.75 ID:???.net (+56,+21,+0)
>>535が敗れたか
590 : Name_Not - 2019/04/01(月) 21:51:05.16 ID:???.net (+4,-18,-29)
バインドするメソッドってなに?
591 : Name_Not - 2019/04/01(月) 21:58:59.79 ID:???.net (+57,+29,-35)
jQuery君は言葉狩りで話を逸らそうと必死だな
592 : Name_Not - 2019/04/01(月) 23:04:20.22 ID:???.net (+94,+29,-74)
言葉狩りじゃないなぁ

理由が「バインドするメソッドなんだから」って
書いてるんだから、その理由の意味を聞いてるわけ。

それが答えられないなら、理由がないってことになる。
593 : Name_Not - 2019/04/01(月) 23:08:44.94 ID:???.net (+75,+29,-8)
偉そうなことは>>548>>579に反論出来てからいおうな
594 : Name_Not - 2019/04/02(火) 01:14:19.26 ID:???.net (+75,+30,-74)
>>592
他意は無いんだが
質問者が未解決のままレス続ける時は
名前欄に最初の質問のレス番号入れてくれんかね
文脈わからなくなるし
混ざって他の質問者が流されたりしちゃうこともあるから

あんまり口うるさくするのもアレなんだけど
マナーっつうか
みんなで使う掲示板なんで、ちょっとした気遣いみたいなもんで
595 : Name_Not - 2019/04/02(火) 01:58:53.89 ID:???.net (-1,-29,-6)
bind で、this を固定するのだろ
596 : Name_Not - 2019/04/02(火) 05:36:12.19 ID:???.net (+74,+29,-116)
おそらくaddEventListenerは要素に関数を紐付ける(バインド)のだから
レシーバー(→this)が要素オブジェクトになると言いたかったんだろうが
紐付けてるからそうなってるのではなくて
紐づけてる風でもあるし、便利だからそうされてたのが
デファクトとして今仕様になってると考えたほうが良いと思う
何れにせよthisをどうしようが自由でそこに言語の縛りはないのだから
597 : Name_Not - 2019/04/02(火) 08:45:37.87 ID:???.net (+57,+29,-28)
いやjavascriptはthisをどうしようが勝手な言語だが他の一般的なクラスベースの言語はそんな自由じゃないだろ
598 : Name_Not - 2019/04/02(火) 10:34:08.65 ID:???.net (+22,-20,-50)
>>596
うん、でもaddEventListenerは複数指定できるから
要素に直接紐づけてるわけじゃないんだよね。

便利だからわざわざthisを要素自身にして呼び出してる
便利だから。jQueryも同じ。便利だからそうしている。
599 : Name_Not - 2019/04/02(火) 12:31:14.19 ID:???.net (+9,-30,-211)
つまり、
$('.hoge').each(function(i, elem) {
console.log(elem);
});
を、
$('.hoge').each(function() {
console.log(this);
});
と書けるようにしてるから便利という意見ですよね。
つまり、
$('.hoge').each((i, elem) => {
console.log(elem);
});
としか書けない、
$('.hoge').each(() => {
console.log(this);
});
とは書けないアロー関数はクソ、thisを自由に変えられるfunction最高という意見ですねw
600 : Name_Not - 2019/04/02(火) 12:42:52.91 ID:???.net (+10,-30,-111)
>>599
thisが変わってほしい時は、function、
thisを変えたくない時は、アロー関数
使い分ければ良いんだよ

所でさ、
1. thisが要素になる・・・使いやすくするため
2. thisが変わらない(つまりアロー関数)・・・関数の外のthisを使える

この2つにメリットが有るのは分かるんだが

3. thisがGlobal(Window)に変わる。(ただし"use strict"の場合はundefined)

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

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


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