1. ホーム
  2. javascript

[解決済み] Uncaught TypeError: (中間値)(...)は関数ではありません。

2022-04-13 23:31:13

質問

クロージャ内のjsロジックを1つのjsファイルとして、以下のように書いたら全てうまくいきました。

(function(win){
   //main logic here
   win.expose1 = ....
   win.expose2 = ....
})(window)

が、同じjsファイルでそのクロージャの前にロギング代替関数を挿入しようとすると。

 window.Glog = function(msg){
     console.log(msg)
 }
 // this was added before the main closure.

 (function(win){
   //the former closure that contains the main javascript logic;
 })(window)

TypeErrorがあると文句を言われる。

Uncaught TypeError: (intermediate value)(...) is not a function

何がいけなかったのか?

どうすればいいですか?

3行目のセミコロンが抜けていることがエラーの原因です。

window.Glog = function(msg) {
  console.log(msg);
}; // <--- Add this semicolon

(function(win) {
  // ...
})(window);

ECMAScriptの仕様には セミコロンの自動挿入のための特定のルール しかし、この場合、次の行から始まる括弧付きの式は、関数呼び出しの引数リストと解釈できるため、セミコロンは自動的に挿入されません。

つまり、このセミコロンがなければ、匿名の window.Glog として関数を呼び出していました。 msg というパラメータがあり、その後に (window) で、その後に返されたものを呼び出そうとした。

このように、コードが解釈されていたのです。

window.Glog = function(msg) {
  console.log(msg);
}(function(win) {
  // ...
})(window);