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:

tiger said...

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

kuy said...

変形していくとわかりやすいと思います:
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])

江添亮 said...

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