大学生からの Web 開発

会社の人に見つかってぽよぽよしてきた

function の文・式、そして即時関数について調べた

こんなコードが会社 Slack にポッと投稿されたのだけど分からないことがあった

!function() {
  window.dribble = 0;
  var elem = document.querySelector("body > div.new_identity > ul > li:nth-child(2) > a > div");
  elem.addEventListener('mouseover', function() {
    window.dribble += 1;
    this.innerText = window.dribble;
  });
}()
  • これ即時関数なんだけど、先頭の ! はナニ???となった
  • :@furuk4wa: 僕の知ってる即時関数は (function () { console.log('hoge') })() だった

そもそも即時関数として実行するには

  • function () をつけるなどして呼び出す
    • 式な

JavaScript における の違い

文(Statement)を簡潔に述べると、処理を実行する1ステップが1つの文といえます。 JavaScriptでは、文の末尾にセミコロン(;)を置くことで文と文に区切りを付けます。

関数の

よって

  • 前述したコードの ! は 続く function を式とするためのものである
!function() {
window.dribble = 0;
var elem = document.querySelector("body > div.new_identity > ul > li:nth-child(2) > a > div");
elem.addEventListener('mouseover', function() {
  window.dribble += 1;
  this.innerText = window.dribble;
});
}()
!function(){}();
+function(){}();
-function(){}();
~function(){}();
(function(){}()); // Grouping Operator
0,function(){}();
a=function(){}();
[function(){}()]; // Array Literal
new function(){}; // 正確にはCallExpressionではなく、NewExpression だが
1+function(){}();
0|function(){}();
0&function(){}();
0||function(){}();
1&&function(){}();
++functtion(){}(); // 実行後エラーがでるけど
--functtion(){}(); // 実行後エラーがでるけど
void function(){}();
typeof function(){}();
delete function(){}();

アロー関数 ( Arrow function ) の場合

通常の関数式の場合、

(function () { / 関数本体 / }());

と書いても

(function () { / 関数本体 / })();

の様に書いてもどちらも即時実行されるのですが、アロー関数の場合は

(() => { / 関数本体 / })();

の様に記述しなければならないようです。

  • とのこと :@furuk4wa: