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

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

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

    /nox/remoteimages/3b/24/b341ccfaffef7698159e1093518a.jpeg【最適な高収入モード】
    ルート設定[アメリカ巡回モード]→カスタマイズ[サイレント]→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がマイノリティなわけがない
    特殊と思う人は自分の思い込みが激しい(こうあるべき固定観念が強い)だけだよ


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

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


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