data:text/html,<a onclick=“alert(function(){})”>hoge</a> これの hoge 押したら on anonymous と出るんだが。 functi が切れとる。 @Opera 10.70
なんてのを見て,幾つか試してみた結果の考察.
前提
Opera 10.70.3451 においては
onclick="alert(arguments.callee)"
とすると
function anonymous(event) {
alert(arguments.callee)
}
と返ってくることから
<a onclick=“alert(foo)”> とするのは,基本的に
a.addEventListener('click',function anonymous(event){alert(foo)},false)
としたのとほぼ等しい.
ちなみに,他のブラウザでは
Google Chrome 6.0.466.0 dev
function (evt){alert(arguments.callee)
}
Firefox 3.6.6
function onclick(event) {
alert(arguments.callee);
}
となり,anonymous function の名前と引数などに差がある.
実験1
alert
の中身を変えてみる.
alert(function(a){})
と引数をとるようにしてみると on anonymous(
と返され,最後に’(’ が一つ増えた.
幾つか入れてみた結果を表にすると,次のようになった.
alert の引数 | 結果 | 備考 |
---|---|---|
function(){} | on anonymous | 発端のパターン |
function(a){} | on anonymous( | 引数ありの無名関数 |
function(a){return a} | on anonymous(event) { | 本体と引数ありの無名関数 |
(function(){}) | n anonymous( | 前後を余分な()でくくる |
(function(a){}) | n anonymous(e | 前後を余分な()でくくる |
(function(a){return a}) | n anonymous(event) { | 前後を余分な()でくくる |
onymous(even | 前後に5つの()でくくる | |
onymous(event | 前後に5つの()でくくる | |
onymous(event) {(改行) aler | 前後に5つの()でくくる | |
(((((function(a){return 12345678901234567890}))))) | onymous(event) {(改行)alert((((((function(a){ | 前後に5つの()でくくり20桁の数字を返す |
実験2
alert
の呼び出しを変えてみる.
alert の引数 | 結果 | 備考 |
---|---|---|
alert(function(){}) | on anonymous | 発端のパターン |
window.alert(function(){}) | ymous(event) | window を明示 |
self.alert(function(){}) | onymous(even | self 経由 |
window.self.alert(function(){}) | (event) {(改行)wi | window.self 経由 |
document.defaultView.alert(function(){}) | (改行)document.de | document 経由で |
考察
実験1と実験2の結果から
- 出力される文字列は,決まった文字列の一部分がみえている
- 出力される文字列の長さは
function(
から}
までの長さと等しい - 出力される文字列の開始位置は
function
の前の文字数によって後ろに伸びる
ことがわかる.
みえている文字列は,'function anonymous(event) {'.length === 'document.defaultView.alert('.length
であることから,前提条件で示した形に整形された,onclick のイベントハンドラと推測できる.
まとめ
Opera 10.70.3451 で onclick="alert(function(){})"
として,alert() にfunction を渡したとき,渡した関数ではなく,onclick イベントハンドラの整形された文字列の一部が出力される.
この時出力される文字列は,
function anonymous(event) {
(onclickで設定したコード)
}
を all とし,(onclickで設定したコード) を evh,alert() に渡した ‘function(){}’ を fun とすると,
all.substring( evh.indexOf('function') ).substring( 0, fun.length )
となっている.