元スレ+ JavaScript の質問用スレッド vol.128 +
JavaScript覧 / PC版 /みんなの評価 :
402 = :
>>401
thisがグローバルスコープになるのってバグみたいのもんだと思ってたから
目から鱗が落ちた。これは入門に書いてほしいわ
403 = :
>>402
我ながらこの発想いいと思うんだよね。といっても俺が考えだしたのじゃなくて
はるか昔のTurboC++付属のマニュアルにC++の仕組みとして書いてあったんだけど。
あとPerlは引数の一番最初をself変数に代入するし、
Pythonもメソッドの第一引数にself引数を書くというルール。
実はPerlのクラス定義の仕方を勉強すると、この挙動が凄く理解できるんだよねw
thisというオブジェクトがあって、それがいろいろ変わるんじゃなくて、
関数の一番初めには必ずthisという"引数"が存在すると考える。
console.log(this)
function foo(this, a, b, c) {
console.log(this)
}
bar = function(this, a, b, c) {
console.log(this)
}
obj.foo(1, 2, 3) だと foo(obj, 1, 2, 3) 相当でobjが第一引数になる。
obj.がない場合はfoo(null, 1, 2, 3)って感じだけど、例外として
第一引数省略時はグローバルオブジェクト(ブラウザの場合はwindow)になると考える。
結局のところ、this"引数" に渡すものは他の引数と同じで呼び出し元が渡すんだよね。
クラスががある言語では、クラスの定義の中でthisと書くと自分自身を表す。などと説明されているけど、
実は呼び出し元が渡していると考えると、統一的に考えることが出来る。
404 = :
なお、ES6のアロー関数はthisをレキシカルに束縛したとかよーわからん説明されているけど、
単にthis引数が本当にない関数ってだけ。
function foo(this, a, b, c) {
element.addEventListener('click', function(this, event) {
thisは何かって? 呼び出し元が渡すんだ、呼び出し元に聞いてくんな。e
})
element.addEventListener('click', (event) => {
thisは何かって? 見りゃわかるだろう?
})
}
405 = :
結局なんで>>390の後者の例がundefinedになるのかぜんぜんわからんわ
406 = :
()忘れてるからだろ
407 = :
これthis関係ないよね
var f=function(){console.log('test')}; console.log(f); とかやるとundefinedが出るのと同じで
ただこういうときはundefinedじゃなくてfunctionとかobjectとか出せよ不親切だなオイってだけでは
408 = :
自己レス
> 実はPerlのクラス定義の仕方を勉強すると、この挙動が凄く理解できるんだよねw
この際だからついでにPerlのクラス定義の仕組みを書いた。
完全にPerlの話題なので、別スレに。
興味があればどうぞ。
Perlについての質問箱 63箱目
http://peace.2ch.net/test/read.cgi/tech/1392820583/67-
409 = :
なんか変な流れになってるなw
> setTimeout(function(){ obj.say(); },1000); // 出力 hoge
こっちはわかるよな? .(ドット)の左側がobjだから、
say関数のthis(見えないthis引数)にはobjが入っている。
> setTimeout(obj.say,1000); // 出力 undefined
こっちは関数呼び出しじゃなくて、関数を渡している。
誰に渡している?setTimeout関数に渡している。
それでsay関数のthis(見えないthis引数)は何になる?
それはsetTimeoutさんが何を渡しているかで決まるんだよ。
だからsetTimeoutの仕様を調べないとわからない。
で、答えを言うと、setTimeoutはwindowをthisとしてsay関数を呼び出している。
だからthis.nameはwindow.nameと同等。undefinedなのは
window.nameに何も入っていないから。
410 = :
コールバックは無名関数が基本やろ
412 = :
コールバック多用するのは糞言語の証
414 = :
bindが使えない環境はまだまだある
416 = :
>>414
具体的には?
http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Browser_compatibility
http://caniuse.com/#feat=es5
417 = :
bindが使えないブラウザはそんなに多いかね
Android 2.3を未だにサポートする人には鬼門かもしれないけど、他に思いつかない
http://kangax.github.io/compat-table/es5/
418 = :
>>405
>>結局なんで>>390の後者の例がundefinedになるのか
一言で言うと、どのように参照されたかの情報が後者は失われるから
プロパティアクセス記法は、何がどのように参照されたかの情報値(参照型)を作る記法だ
しかし、JSの表の世界に参照型値が存在しないことから分かるように、
参照型値は(グルーピング「()」を除いて)何かの演算子に利用される段階になると必ず解決され別の値になる
それは関数呼び出し時の引数でも言え、setTimeoutに渡るのは実際の関数値であり、参照情報が失われてしまう
一方プロパティアクセス記法に続けて関数呼び出し演算子を記述すると、演算子内で参照情報が利用できる
419 = :
121 名前:おかいものさん[sage] 投稿日:2016/01/14(日) 01:38:07.45
某アングラ雑誌で紹介されたら大人気キタこれビッグブラザー!!!
自動ネット収入システム
AUTO WEB MONEY ラストアンリミテッド
http://software.saikyou.biz/
ルート設定[アメリカ巡回モード]→カスタマイズ[サイレント]→IP設定[自動]→再起動→ルート設定[自動]→カスタマイズ[高速モード]
122 名前:おかいものさん[sage] 投稿日:2016/01/14(日) 01:42:50.11
>>121
WinnyやShareと一緒に紹介されるなんてどこのアングラソフトだよwwww
でもほんの1ヶ月で40万達成うれしすぎる
126 名前:おかいものさん[sage] 投稿日:2016/01/14(日) 02:07:52.85
>>121
買うまでもないから立ち読みしたw
コミュニティが賑わいすぎてヤベーwwwww
ミクシィの最盛期を思い出したwwwww
127 名前:おかいものさん[sage] 投稿日:2016/01/14(日) 02:08:46.58
>>122
こんだけ人気出て来てるのにいまだにアフィリとかPPCとかヨウツベ収入とか頑張ってるアホいんだなwwこんだけで月35万以上は稼げるのにな
128 名前:おかいものさん[sage] 投稿日:2016/01/14(日) 02:12:13.62
>>127
負け犬は話題に乗り遅れる習性があるからじゃね?www
AUTO WEB MONEY>>>>>>>>>>>>超えられない壁>>>>>>>>日本の負け犬ネットビジネス
421 = :
>>418で理解できると思う人いる?
自己満の文章だなw
423 = :
先に言っておくと冗長になる
424 = :
>>421
マジかよ……
確かに>>391の時は分かって貰う気も無く書いたが、
>>418はそれなりに噛み砕いて説明したつもりだぞ
じゃあ今度は目一杯噛み砕いて説明する
JavaScriptがプログラミング言語JavaScriptとして動作するために、仕様で
【 obj 】と【 . 】と【 say 】が組み合わされた【 obj.say 】という文字の羅列と、
『 objオブジェクトからsayプロパティを取り出す 』という動作を結びつける必要がある
それなら、メンバ演算子(ドット演算子、プロパティアクセス記法)の挙動として、
オブジェクトからの値の取り出しを仕様とすればいいかというと、それでは都合が悪い
delete、typeof、代入演算子などを考えれば分かるが、【 obj.say 】の時点で既に値として解決されてしまってはマズイ
そのためメンバ演算子は、『 どういう状態でのどこからの何に対しての参照 』情報を作ることになっている
これは参照型(Reference型)として定義され、表には現れないが言うならばプリミティブとオブジェクトと並ぶ第三の立場の型である
そして、関数呼出演算子(関数呼出記法、【 ( ) 】)は与えられたものが参照型値であるなら、参照型値の『 どこから 』情報を利用し、
これをthis値として関数を呼び出す挙動をすることになっている
つまり、プロパティアクセス記法に続けて関数呼出記法を記述していれば、前者で生まれた参照型値がそのまま後者に渡るため問題ない
しかし、参照型値は一時的なものでしかないので、いろいろな利用行為を受けるとすぐ参照が解決されてしまう
例えばsetTimeoutと言った関数の引数として渡すと言う行為でもそうで、
『 objオブジェクトからのsayプロパティに対しての参照 』解決された関数(Function型値)が渡される
つまりsetTimeoutは、例えその関数がどのように参照されたか知りたくも、知ることができない
以下長くなるのでsetTimeoutネイティブ関数の想定仮想内部コードを元にしたES仕様説明は割愛する(必要だと言うならする)が、
結果関数呼び出し時に『 どこから 』情報がないので(strictモードなら)this値がundefinedとして呼び出されることになる
425 = :
Aに関する説明する時、Bという用語を使って説明する。
この時Aを知らない人は、Bも知らないだろうなっていう
用語を使って説明しても、なお分からない。
426 = :
>>425
確かに前の解答はそうだったが、今回はそれに対しては十分と留意したつもりだ
キーワードは類語を並べ、なるべく漢字の熟語を使うことで、
例え聞いたことがなくとも、特に根幹の部分は意味が類推できるようにした
「何から何を参照する」などの一般的な用語の意味、感覚が分かり、
「プロパティ」などの基本的な用語を理解していれば重要な部分は伝わると思う
もし何か不手際があれば具体的にどこがどうわかりづらいか教えてほしい
428 = :
>>423
つまり匿名関数さん最強ってことか
429 = :
いいや、別にbind使っていいと思うよ。
むしろ匿名関数の方が冗長かな。
430 = :
>>424はどんな表情でこれ書いてたんだろうな・・・・
431 = :
流れとは関係ないけど>>404がすげえわかりやすかった
432 = :
>>424は仕様を中途半端に理解した誤解が多数見受けられて分かっている人でも脳内変換(修正)が必要で読みづらいわ
・参照型(Reference型)はObject型と並列に語れない(× 参照型はプリミティブとオブジェクトと並ぶ第三の立場の型)
・Function型はない
・Strict Modeでもthis値はundefinedにならない
特に最後の誤解が酷い
にわかが無理して専門用語を使おうとするなよ
433 = :
値段たっかいのに読みにくいだけの中身スッカスカな専門書()に似てる
434 = :
経験はそれなりにあるがJavaScriptに精通しているわけではないタイプ
プライドだけは異常に高い
435 = :
javascriptは別にブラウザだけで使われてるわけじゃないんだが
おまえらの頭はブラウザしかないんだな
436 = :
JavaScriptはブラウザ以外でも実装されているだろうが、今は関係ないだろう
437 = :
仕様の話をしている時に実装の話を持ってくるとか、恥の上塗りすぎないか?
438 = :
単にほかの話に突っ込んだだけだがボッコの流れに乗った方がよかったか
439 = :
JSって実行環境がブラウザで表面上はとっつきやすく初心者向けの言語だけど
仕様が特殊で実はわかりにくい言語なんだよな
440 = :
「おまえらの頭はブラウザしかないんだな」が唐突過ぎるというか、ブラウザでなくてもsetTimeoutが実装されていれば仕様通りの挙動が求められるし、なぜブラウザしか頭にないって発想になるんだ?
441 = :
>>439
特殊とは思わないけど、どの辺りが特殊?
442 = :
>>439
どの言語にも初心者は特殊と思うような仕様がある。
それは普通のことであり、言語が特殊なのではない。
初心者が無知なだけなのだ。
443 = :
プロトタイプってだけでだいぶ特殊だな
444 = :
プロトタイプベースのプログラミング言語をクラスベースのプログラミング言語に慣れ親しんだ人は『特殊』と言うよね。
Javaやってた人が、JavaScriptを侮蔑するような感じでw
土俵が違うので、比べるもんじゃないけど、
同じOSSカテゴリーに括られる事に、無意味な抵抗を感じている人を何人も観た事ある。
同じ”Java”と付けられているのが、癇に障るのかな。
かく言う自分も、JavaScriptをJavaと省略してくる奴には、間髪入れずに修正してしまうけどwww
446 = :
慣れ親しんだとかそういう問題じゃない
447 = :
極単純な勉強不足
上の方で長々と間違いだらけの説明をした奴も自分で理解できない領分の理解を諦めた口
448 = :
誰も勉強不足の話をしてるわけじゃないんだがな(笑)
449 = :
別に難しいとか理解不能とかそういうことを言ってるわけでもなくてだな
特性としてマイノリティーってだけだ
450 = :
これだけ普及したJavaScriptがマイノリティなわけがない
特殊と思う人は自分の思い込みが激しい(こうあるべき固定観念が強い)だけだよ
類似してるかもしれないスレッド
- + JavaScript の質問用スレッド vol.125 + (1001) - [97%] - 2015/10/7 17:45
- + JavaScript の質問用スレッド vol.108 + (1001) - [97%] - 2013/9/21 15:16
- + JavaScript の質問用スレッド vol.118 + (1002) - [97%] - 2014/8/29 22:30
- + JavaScript の質問用スレッド vol.120 + (1002) - [97%] - 2014/11/8 1:15
- + JavaScript の質問用スレッド vol.121 + (1001) - [97%] - 2022/11/29 16:30
- + JavaScript の質問用スレッド vol.121 + (1001) - [97%] - 2015/1/1 18:30
- + JavaScript の質問用スレッド vol.122 + (1004) - [97%] - 2015/2/14 4:45
- + JavaScript の質問用スレッド vol.122 + (116) - [97%] - 2018/5/2 18:30
- + JavaScript の質問用スレッド vol.123 + (966) - [97%] - 2020/10/20 2:30
- + JavaScript の質問用スレッド vol.138 + (1004) - [97%] - 2019/4/20 23:45
- + JavaScript の質問用スレッド vol.129 + (981) - [97%] - 2016/5/5 8:16
- + JavaScript の質問用スレッド vol.129 + (926) - [97%] - 2017/7/27 13:45
- + JavaScript の質問用スレッド vol.123 + (1002) - [97%] - 2015/4/27 23:30
- + JavaScript の質問用スレッド vol.127 + (1001) - [97%] - 2016/2/4 0:15
- + JavaScript の質問用スレッド vol.127 + (160) - [97%] - 2021/7/16 9:30
- + JavaScript の質問用スレッド vol.126 + (952) - [97%] - 2015/11/18 13:15
- + JavaScript の質問用スレッド vol.126 + (348) - [97%] - 2023/1/12 17:00
トップメニューへ / →のくす牧場書庫について