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])
というのと同じであるらしい。しかし、これでもよく分からない。一体、どれほどのものを吸えば、このコードが理解できるようになるのだろうか。
あかん、久しぶりに笑いが止まらん
ReplyDelete変形していくとわかりやすいと思います:
ReplyDeleteFunction.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])
ああ、なるほど、call.applyで、function (a) {return a}をthisとして、それに対してcallが呼ばれるのか。
ReplyDeleteそして、1もthisとなるので、2が返される。
なるほどなるほど。