hack のためのネタ帳, etc,,,

状況

ここ(seesaawiki)のフリーエリアに仕込んでるスクリプトを整理してたんだが、
Uncaught TypeError: ({_getTracker:(function(s) {
    return {
      _initData : function(){},
      _trackPageview : function(){}
    };
  })}) is not a function
    <anonymous> https://seesaawiki.jp/w/kou1okada/d/%a5%b3%a5%f3%a5%d4%a5%e5%a1%bc%a5%bf%a1%bc%bb%a8%bb%ef:774
%a5%b3%a5%f3%a5%d4%a5%e5%a1%bc%a5%bf%a1%bc%bb%a8%bb%ef:774:1
みたいなエラーを出してしまった結果、しばらく原因に思い至れず往生してしまった。

744 行目は、例えば、
(function(){
  function hello() {
    console.log("hello");
  }
  window.addEventListener('load', hello);
})();
みたいなコードなんだが、
単純に
// ※1
(function(){
  console.log("hello");
})();
とか
// ※2
(function(){
})();
とかにしても同じエラーになる。

しかし、これを
window.addEventListener('load', function(){
  function hello() {
    console.log("hello");
  }
  hello();
});
ってしたり、
function hello() {
  console.log("hello");
}
window.addEventListener('load', hello);
ってしたり
window.addEventListener('load', function() {
  console.log("hello");
});
ってしたりした場合にはエラーは生じない。

冷静になって考えてみれば、そもそもの話、※1、※2 がエラーになる時点で問題はこの部分ではなく別の部分にあるのは明白なんだけど、ぱっと原因に思い至れず、前後のコードを削っては実行、削っては実行を繰り返すという、知性の欠片も感じられないデバッグ手法に頼る他なく、問題の箇所をあぶり出すのに無駄な時間を費やしてしまった。

原因

何のことはない、コメントを挟んだ直前の行に
_gat = {
  _getTracker : function(s) {
    return {
      _initData : function(){},
      _trackPageview : function(){}
    };
  }
}
みたいなコードを書いてしまっていたことが原因だった。
確かに、エラーメッセージにもこのコードの一部が引用されていたのだが、これはずいぶん前に書いたコードで、前後の内容をろくに読まず作業してて、更には間にコメントを挟んでいたり、名前に _ が入っていてシステム側のコードっぽく見えたり、とかいろいろ言い訳じみた理由が沢山重なって、このコードを引用してることに気づけなかったのが今回の敗因。
で、このコードの一体何が悪いのか?

種明かしをすれば、見事なまでに、末尾に終端の「;」を忘れているのというオチだった。

単純化すると、
これ
a = {a:"c"}
(function(){})();

こう
Uncaught TypeError: ({}) is not a function
    <anonymous> debugger eval code:2
debugger eval code:2:1
なったり、
これ
0
(function(){})();

こう
Uncaught TypeError: 0 is not a function
    <anonymous> debugger eval code:2
debugger eval code:2:1
なったり、
これ
function foo(){}
foo()
(function(){})();

こう
Uncaught TypeError: foo() is not a function
    <anonymous> debugger eval code:3
debugger eval code:3:1
なったりするという現象。

なまじ終端の「;」を忘れても動いてしまう場合があるだけに、原因を特定した瞬間は心が折れた。
終端、大切。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます