2010-05-14

なんじゃこりゃ。

wtfjs

alert.call.call.call.call.call.apply(function (a) {return a}, [1,2]) // 2

@cramforceがこれを発見したとき、何かとてつもなくすばらしいのを吸ってたに違いない

これは単に、

Function.prototype.call.apply(function (a) {return a}, [1,2])

というのと同じであるらしい。しかし、これでもよく分からない。一体、どれほどのものを吸えば、このコードが理解できるようになるのだろうか。

3 comments:

  1. あかん、久しぶりに笑いが止まらん

    ReplyDelete
  2. 変形していくとわかりやすいと思います:
    Function.prototype.call.apply(function (a) {return a}, [1,2])
    (function (a) {return a}).call(1, 2)
    (function (a) {return a})(2)

    alert.call.call.call.call.call.apply(function (a) {return a}, [1,2])
    (function (a) {return a}).call(1, 2)
    (function (a) {return a})(2)

    callableなオブジェクトなら何でもいいので、前半はフェイクってことです。

    callとapplyを逆にすると:
    alert.apply.apply.apply.apply.apply.call(function (a) {return a}, 1, [2])

    ReplyDelete
  3. ああ、なるほど、call.applyで、function (a) {return a}をthisとして、それに対してcallが呼ばれるのか。
    そして、1もthisとなるので、2が返される。
    なるほどなるほど。

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.