arguments.calleeがstrictモードで禁止な理由

arguments.calleeが危険という話を聞いて何でだろ?と思ったら、色々教わったのでツイート纏めました。
16
Yoshiaki Kawazu🐸ずん @kawaz

これ軽くググっても理由がわからないんだが何で危険なの?>「arguments.calleeの使用が、ECMAScript 5のStrictモードがサポートしていないことからもわかるように、危険なこと」/無くてもまぁ困らないけど理由を知り… http://t.co/I9sPoAv0

2011-11-18 21:18:59
koichik @koichik

@kawaz それらは Good Parts に書いてないので、使うとダグラス様がマシンガン乱射して危険だからです。というか、caller はそもそも ECMA-262 で規定されたことがないとか、callee 使うくらいなら関数に名前つけろとか。

2011-11-18 21:38:35
koichik @koichik

@kawaz 補足。昔は関数リテラルだと名前がつけられなくて、再帰するには callee 使うしかなかったらしいけど、今は名前つけられるからもういらないよねキャハハーみたいな理由じゃないかな? cc/ @Constellation

2011-11-18 21:40:31
Yoshiaki Kawazu🐸ずん @kawaz

@koichik へぇ、calleeがそもそも規定されたことがなって初めて知りました。無くても名前つければよいだけで大して困らないから良いけど、今後控えるにしても理由を知っておきたかったので。ありがとうございます、参考になりました。

2011-11-18 21:44:20
koichik @koichik

@constellation 速い! しかし 70 ページか。。。 帰宅してから見てみますー。

2011-11-18 21:47:52
koichik @koichik

@kawaz そもそもなかったのは (今も strict mode でエラーになるってことしか書いてないけど) callee ではなくて caller の方です。

2011-11-18 21:50:09
小倉唯 @Constellation

SES caja strict modeとかでググるとMark S. Miller先生が教えてくれます.

2011-11-18 21:59:20
Yoshiaki Kawazu🐸ずん @kawaz

@Constellation @koichik つまり「環境への影響力がある」ってのがstrictで使えない理由か。逆にこれを理解すると非strictでも再帰に使う程度の用途なら危険ではない、ってことになるのか。スッキリしました。

2011-11-18 22:12:08
小倉唯 @Constellation

@kawaz argumentsの環境連携とFunction.argumentsの存在がまずいから始まって, 呼び出し元とれるarguments.callerまずいとなって, でarguments.callee.callerまずいとなって, 廃止と認識していますー.

2011-11-18 22:34:41
小倉唯 @Constellation

@kawaz @koichik あと, argumentsが引数を表すもので, calleeがついてることを望まれていないというのがおそらく理由です. http://t.co/byA7crzi と書いたときに, calleeが取れるのは望ましくないということだと認識しています.

2011-11-18 22:44:05
Y.K @mocchira

@kawaz http://t.co/L3v0JHB9 再帰呼び出し時の実行コンテキストによってthisの参照先が変わるとか、callerプロパティで任意のスタック上の関数を参照できるようになると、インタプリタが安全に関数を実行することが事実上不可能になるのが問題みたいですね

2011-11-18 22:51:42
Yoshiaki Kawazu🐸ずん @kawaz

@Constellation 確かにそうですね。ていうかこうなるともうargumentsって最初からArray.prototype.slice.call(arguments)したのが入っててくれよって気にもなりますw

2011-11-18 23:23:39
小倉唯 @Constellation

@kawaz ES.nextではrest parameterが入ることになっており, こちらは単純な配列になる予定で, argumentsについては使わないようにという空気になっていますー.

2011-11-18 23:26:40
Yoshiaki Kawazu🐸ずん @kawaz

@Constellation そうなんですか。やっぱりみんなただの配列にしてくれよって思ってたんだなw とはいえ互換性も考えると結局Array.prototype.slice.call(arguments)を使うくらいまでが落とし所な感じですね。

2011-11-18 23:30:55
小倉唯 @Constellation

@kawaz まあ「ES.nextでは将来的には使うのを避けるように」という話 + ES.nextまだまだ先なのでー

2011-11-18 23:32:31
koichik @koichik

@constellation @kawaz SES の PDF 見始めたけど,caller.arguments[1] = ... なんて破壊的なことができたのね.知らなかったw そりゃ廃止するしかありませんな.

2011-11-19 00:44:49
koichik @koichik

っていうか,Function に arguments なんていらなくね? (ES5 にはなさげだけど) 呼び出しのたびに Function オブジェクトが変更されてるってキモい.

2011-11-19 00:47:58
小倉唯 @Constellation

@koichik という訳で, strict modeではこの割とろくでもない環境連携機能が削除されたりしましたー. http://t.co/toQtfLdX

2011-11-19 00:51:33