data:text/html,<a onclick=“alert(function(){})”>hoge</a> これの hoge 押したら on anonymous と出るんだが。 functi が切れとる。 @Opera 10.70

http://twitter.com/0mg/status/18657195451

なんてのを見て,幾つか試してみた結果の考察.

前提

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 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 ) 

となっている.